2010-06-08 57 views
0

我正在做一个粒子系统为我的比赛,这基本上是烟火箭走出来在我的游戏。所有的粒子都在称为烟雾的ccArray中。的cocos2d ccArray删除对象是缓慢

ccArray *smoke = ccArrayNew(0); 

我有一个叫烟类,这是CCSprite的一个子类,其中添加叫做__opacity伊娃的。

当我添加一个新的烟雾对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个烟雾颗粒时,它从60 FPS变为15-20 FPS。

任何想法我怎么能加快这?

此外,理由我用ccArray而不是NSMutableArray的是因为我读ccArray更快。

+0

还看到:http://www.learn-cocos2d.com/2010/09 /阵列的性能比较,CARRAY-ccarray-的NSArray,NSMutableArray里/ – LearnCocos2D 2011-10-14 21:43:15

回答

1

除去从中间或阵列(任何数组)的开始对象将重新排列,并且操作是非常缓慢(ALLOC +成员的复制),如果有datastruct与许多将删除未在端部你应该用一个链表

这里的一些执行我在互联网上找到(没有测试它,但它看起来体面) http://www.cocoadev.com/index.pl?DoublyLinkedList

+1

或'NSSet'如果你不需要有序访问。 – 2010-06-08 15:16:27

+0

的NSSet是一个很好的解决方案,如果你并不需要订购的苹果没有链表实现提供 – 2010-06-08 15:23:25