0

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

我想知道延迟的原因可能是什么。我还试图通过使用仪器来确定是否存在瓶颈。加载大量图像会导致延迟吗?还是有很多数值计算是原因?

如果您可以分享任何类似的经验,或者您可以提出一些可能的延迟原因以及如何避免它们,这将很有帮助。

谢谢阿比纳夫

4

2 回答 2

1

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

强烈建议您使用该CCLayer update方法而不是调度程序或 NSTimer。

于 2011-02-21T19:58:08.193 回答
0

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

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

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

[[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;
}

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

感谢斯蒂芬的回复:)

于 2011-02-25T21:55:22.513 回答