如何在cocos2d中保持fps速率不变

时间:2010-11-28 11:36:42

标签: cocos2d-iphone

我有3个问题。

  1. 如何在cocos2d中保持fps速率恒定(几乎)。当在每秒(5-8)的小间隔内创建和删除大量CCSprite时,可以保持帧速率几乎不变??

  2. [self removeChild:sprite cleanup:YES]是否足够,或者我也应该使用

    CCTexture2D * texture = [精灵纹理]; [[CCTextureCache sharedTextureCache] removeTexture:texture];

  3. 以下部分代码负责我的帧丢弃。如何以更好的方式完成相同的任务 -

    id fadeout = [CCFadeOut actionWithDuration:1.4f];

  4.   

    id call = [CCCallFunc   actionWithTarget:自   选择器:@selector(RemoveSmashedSprite:)];

    CCSequence* sequence= [CCSequence actions:fadeout, call, nil];
    [smash runAction:sequence];
    

    -(void)RemoveSmashedSprite:(id)sender
    {
    
    
        CCSprite *sp = (CCSprite *)sender;
    
    
    
        [self removeChild:sp cleanup:YES];  
    
    }
    

    这称为每秒5-8次。所以帧速率下降。任何人都可以帮助我。

1 个答案:

答案 0 :(得分:4)

我在猜测"粉碎精灵"问题可能是屏幕上可见的一些精灵中的一个,很可能共享相同的纹理(也许是精灵片的一部分,或者所有相同的图像等)。

如果是这种情况,我建议您在屏幕上分配游戏所需的精灵数量,而不是“#34; destroy" (删除它们,重新创建它们)你应该"重新使用它们"。

在NSMutableArray中存储对所有CCSprite的引用,使用您认为合适的精灵数量填充此数组(每秒删除多少精灵?每秒添加多少精灵?有多少精灵?在屏幕上开始? - 使用这些问题的答案来确定最合适的数组大小。)

然后,不要将小精灵作为孩子移除,只需[sprite setVisible:NO]隐藏它,然后......当你需要在屏幕上显示一个新精灵时,使用下一个"可用&#34 ; (隐藏)数组中的sprite(跟踪最后一个"使用"带有索引的sprite,然后简单地将其递增1以找到下一个"可用"。一旦索引超过边界,将其重置为0 - 此时,该精灵应该被"粉碎")。一旦你有了下一个"可用"精灵,改变它的属性(位置,比例,纹理?,可见性)并应用任何适当的动作(不要忘记"停止所有动作"在#34;粉碎它" - 这就是"清理:是"确实如此。

如果你的游戏不允许你在"圈中四处走动"像这样,因为用户通过以不同的顺序与精灵交互来决定可见或不可见的东西,那么你可以存储对被击碎的精灵的引用"在一个单独的数组中(同时将它们保存在原始数组中 - 然后你可以从"未使用的"数组中选择任何对象,从该数组中删除它,然后如上所述改变它)。

这会显着降低您的帧速率下降,因为您不会一直在创建和销毁精灵。


可能发生的另一件事是您正在使用不同的图像,并且每个图像都是单独存储的(image1.png,image2.png,image3.png),这些图像的创建/销毁会导致纹理被删除然后重新添加...来解决这个问题,创建一个精灵表并将精灵表添加到纹理缓存中,然后用spriteFromSpriteCacheName创建你的图像:@" image1.png"&#39 ;