我正在制作类似于iphone的半身像游戏。我正在使用cocos2d。我有时会在比赛中遇到滞后。我有6种不同类型的球。我正在创建每种类型的30个实例,我重用它们。当我投球并且球不会与侧面的墙壁或屏幕上的球碰撞时,问题就出现了。我相信这可能是由于滞后造成的。当球被击中时,我初始化一个调度器,每0.01秒运行一次以检查它是否与任何其他球碰撞。在每个间隔中,我为射击的球创建一个矩形,并为所有其他球创建一个矩形并检查交叉点。
我想知道滞后的原因是什么。我也试图通过使用仪器来确定是否有任何瓶颈。可能有很多图像加载导致滞后?或者可以进行大量的数值计算?
如果您可以分享任何类似的经历,或者如果您可以提出一些可能的滞后原因以及如何避免它们,那将会很有帮助。
由于 阿比纳夫
答案 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的回复:)