cocos2d ccArray删除对象很慢

时间:2010-06-08 15:08:00

标签: iphone c cocos2d-iphone

我正在为我的游戏制作一个粒子系统,它基本上是我游戏中火箭喷出的烟雾。所有粒子都在ccArray中,称为烟雾。

ccArray *smoke = ccArrayNew(0);

我有一个名为Smoke的类,它是CCSprite的子类,添加了一个名为__opacity的ivar。

当我向ccArray添加新烟雾时,我确实喜欢这样:

ccArrayAppendObject(smoke, [Smoke spriteWithFile: @"smoke.png"]);
[smoke->arr[smoke->num - 1] setupWithTouch: touch andOpacity: 255.0f];
[self addChild: smoke->arr[smoke->num - 1]];

这根本没有滞后,而且很快,

这就是我每帧处理烟雾的方式:

if(smoke->num > 0)
{
    for(NSUInteger i = 0; i < smoke->num; i++)
    {
        Smoke *s = smoke->arr[i];

        s.__opacity = s.__opacity - 255.0f * delta;

        [s setOpacity: s.__opacity];

        if(s.__opacity <= 0.0f)
        {
            [self removeChild: s cleanup: YES];
            ccArrayFastRemoveObjectAtIndex(smoke, i);
        }
    }
}

当不透明度小于0时,我们从场景中移除烟雾,然后

将其从数组中删除 - 这是减慢游戏速度的部分,将其从数组中删除。它从60 FPS变为15-20 FPS,当时有60个烟雾颗粒出现在场景中。

我有什么想法可以加快速度吗?

另外,我之所以使用ccArray而不是NSMutableArray,是因为我读ccArray的速度更快。

1 个答案:

答案 0 :(得分:1)

从数组的中间或开头删除对象(任何数组)将重新创建数组,并且操作非常慢(alloc +成员的副本),如果你有多个数据结构删除不到最后你可能应该使用链表

这里我在互联网上发现了一些实现(没有测试过,但它看起来不错) http://www.cocoadev.com/index.pl?DoublyLinkedList