2010-06-08 71 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