我正在为我的游戏制作一个粒子系统,它基本上是我游戏中火箭喷出的烟雾。所有粒子都在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的速度更快。
答案 0 :(得分:1)
从数组的中间或开头删除对象(任何数组)将重新创建数组,并且操作非常慢(alloc +成员的副本),如果你有多个数据结构删除不到最后你可能应该使用链表
这里我在互联网上发现了一些实现(没有测试过,但它看起来不错) http://www.cocoadev.com/index.pl?DoublyLinkedList