在iphone cocos2d游戏中出现滞后的可能原因是什么?

时间:2011-02-21 19:08:51

标签: cocos2d-iphone lag

我正在制作类似于iphone的半身像游戏。我正在使用cocos2d。我有时会在比赛中遇到滞后。我有6种不同类型的球。我正在创建每种类型的30个实例,我重用它们。当我投球并且球不会与侧面的墙壁或屏幕上的球碰撞时,问题就出现了。我相信这可能是由于滞后造成的。当球被击中时,我初始化一个调度器,每0.01秒运行一次以检查它是否与任何其他球碰撞。在每个间隔中,我为射击的球创建一个矩形,并为所有其他球创建一个矩形并检查交叉点。

我想知道滞后的原因是什么。我也试图通过使用仪器来确定是否有任何瓶颈。可能有很多图像加载导致滞后?或者可以进行大量的数值计算?

如果您可以分享任何类似的经历,或者如果您可以提出一些可能的滞后原因以及如何避免它们,那将会很有帮助。

由于 阿比纳夫

2 个答案:

答案 0 :(得分:1)

一个100Hz(0.01秒)的计时器会让你的游戏慢下来。大多数PC甚至无法处理具有该频率的调度程序(主要是操作系统开销,但我离题了)。

强烈建议您使用CCLayer update方法而不是计划程序或NSTimer。

答案 1 :(得分:0)

好的,所以我发现了问题:)

事情是,在我的游戏中,我正在加载100个球。 5种类型中的每种20种。除此之外,我还加载了一些爆炸动画和一些其他动画生物。所以问题来了,因为每个纹理都是单独加载的,即使它们中的大多数使用相同的纹理。所以每帧120个奇怪的纹理被加载。

解决方案是使用Batchnode。所以现在我只加载1个纹理而不是20个。所以总共而不是120我现在只加载6或7 :)现在所有滞后和滞后相关的错误都消失了。

[[CCTextureCache sharedTextureCache] addImage:@"ball-black.png"];
SpriteSheet1 = [CCSpriteBatchNode batchNodeWithFile:@"ball-black.png"];
[self addChild:SpriteSheet1 z:4];
//---------FIRE BALLS---------

for (int i = 0; i<20; i++) 
{
    f[i] = [[Fire alloc]init];
    //[f[i] getball] = [CCSprite spriteWithFile:@"ball-black.png"];
    [SpriteSheet1 addChild:[f[i] getball]];
    [[f[i] getball] setPosition:ccp(220,-200)];
    f[i].isBallMoving = FALSE;
}

希望它可以帮助有同样问题的人。

感谢Stephen的回复:)