Cocos2d iphone 如何在cocos2d中保持fps速率恒定

Cocos2d iphone 如何在cocos2d中保持fps速率恒定,cocos2d-iphone,Cocos2d Iphone,我有三个问题 如何在cocos2d中保持fps速率恒定(几乎)。当大量CCSprite在每秒(5-8)这样的小间隔内创建和删除时,是否可以保持帧速率lmost恒定 [self-removeChild:sprite cleanup:YES]足够了,或者我也应该使用它 CCTexture2D*纹理=[sprite纹理]; [[CCTextureCache sharedTextureCache]移除纹理:纹理] 下面的代码部分负责我的帧丢失。如何以更好的方式完成相同的任务- id淡出=[CCFadeO

我有三个问题

  • 如何在cocos2d中保持fps速率恒定(几乎)。当大量CCSprite在每秒(5-8)这样的小间隔内创建和删除时,是否可以保持帧速率lmost恒定

  • [self-removeChild:sprite cleanup:YES]
    足够了,或者我也应该使用它

    CCTexture2D*纹理=[sprite纹理]; [[CCTextureCache sharedTextureCache]移除纹理:纹理]

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

    id淡出=[CCFadeOut actionWithDuration:1.4f]

  • id call=[CCCallFunc 行动目标:自我 选择器:@selector(RemoveSmashedSprite:)]

    这被称为每秒5-8次。因此帧速率会降低。有人能帮我吗。

    我猜,所讨论的“破碎的精灵”可能是屏幕上可见的众多精灵中的一个,更可能共享相同的纹理(可能是精灵表的一部分,或者是所有相同的图像,等等?)

    如果是这种情况,我建议分配游戏需要在屏幕上显示的精灵数量,而不是“销毁”(移除它们,重新创建它们),而是“重新使用它们”

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

    然后,不要将精灵作为子对象移除,只需[sprite setVisible:NO]将其隐藏,然后…当您需要在屏幕上显示新精灵时,使用阵列中的下一个“可用”(隐藏)精灵(使用索引跟踪上一个“使用过”的精灵,只需将其增加1,即可找到下一个“可用”精灵。一旦索引超出边界,将其重置为0-此时,该精灵应已“粉碎”)。一旦有了下一个“可用”精灵,请更改其属性(位置、比例、纹理?、可见性),并应用任何适当的操作(“粉碎”时不要忘了对其“停止所有操作”-这就是“清理:是”是的)

    如果你的游戏不允许你像这样在一个“圆圈”里转圈,因为用户通过以不同的顺序与精灵交互来决定什么是可见的,什么是不可见的,那么你可以将对“破碎精灵”的引用存储在一个单独的数组中(同时也将它们保存在原始数组中-然后你可以从列表中选择任何对象)“未使用”数组,将其从该数组中删除,然后如上所述对其进行更改)

    这将大大降低帧速率下降,因为您不会一直创建和销毁精灵


    另一件可能发生的事情是,您使用的是不同的图像,并且每个图像分别存储(image1.png、image2.png、image3.png)创建/销毁这些会导致纹理被删除并重新添加…要解决此问题,请创建一个精灵表并将精灵表添加到纹理缓存,然后使用“spriteFromSpriteCacheName:@“image1.png”创建您的图像。

    我猜“sprite sprite”是“有问题的可能是屏幕上可见的多个精灵中的一个,更可能是共享相同的纹理(可能是精灵表的一部分,或者是所有相同的图像,等等?)

    如果是这种情况,我建议分配游戏需要在屏幕上显示的精灵数量,而不是“销毁”(移除它们,重新创建它们),而是“重新使用它们”

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

    然后,不要将精灵作为子对象移除,只需[sprite setVisible:NO]将其隐藏,然后…当您需要在屏幕上显示新精灵时,使用阵列中的下一个“可用”(隐藏)精灵(使用索引跟踪上一个“使用过”的精灵,只需将其增加1,即可找到下一个“可用”精灵。一旦索引超出边界,将其重置为0-此时,该精灵应已“粉碎”)。一旦有了下一个“可用”精灵,请更改其属性(位置、比例、纹理?、可见性),并应用任何适当的操作(“粉碎”时不要忘了对其“停止所有操作”-这就是“清理:是”是的)

    如果你的游戏不允许你像这样在一个“圆圈”里转圈,因为用户通过以不同的顺序与精灵交互来决定什么是可见的,什么是不可见的,那么你可以将对“破碎精灵”的引用存储在一个单独的数组中(同时也将它们保存在原始数组中-然后你可以从列表中选择任何对象)“未使用”数组,将其从该数组中删除,然后如上所述对其进行更改)

    这将大大降低帧速率下降,因为您不会一直创建和销毁精灵


    另一件可能发生的事情是,您使用的是不同的图像,并且每个图像分别存储(image1.png、image2.png、image3.png)创建/销毁这些会导致删除并重新添加纹理…要解决此问题,请创建一个精灵表并将精灵表添加到纹理缓存,然后使用“spriteFromSpriteCacheName:@“image1.png”创建图像

    CCSequence* sequence= [CCSequence actions:fadeout, call, nil];
    [smash runAction:sequence];
    
    -(void)RemoveSmashedSprite:(id)sender
    {
    
    
        CCSprite *sp = (CCSprite *)sender;
    
    
    
        [self removeChild:sp cleanup:YES];  
    
    }