2012-06-30 47 views
1

點陣列線的最有效方法定的動態CGPoint S的NSMutableArray,什麼是借鑑array[0]array[1]array[1]array[2]等最快和最有效的方法是什麼?我應該用C或C++重寫我的函數以獲得更好的性能嗎?目前,當陣列中有超過20個點時,我的幀速率顯着下降。我正在使用cocos2d v2.0.0-rc2,目前我有:繪製從在cocos2d

-(void)draw 
{ 
    for (int i = 0; i < [points count]; i+=2) 
    { 
     CGPoint startFromArray = [[points objectAtIndex:i] CGPointValue]; 
     CGPoint endFromArray = [[points objectAtIndex:i+1] CGPointValue]; 

     ccDrawLine(startFromArray, endFromArray); 
    } 

    [super draw]; 
} 
+0

你嘗試過使用純C數組嗎?順便說一句,你如何將CGPoints存儲在NSMutableArray中?這是你寫的擴展名嗎? – DrummerB

+0

對安東尼:如果你去OpenGL的水平,你將能夠通過一個簡單的函數調用,傳遞一個C數組點。 to DrummerB,你可以使用CGPoints作爲對象封裝他們到一個NSValue實例:[NSValue valueWithCGPoint:myPoint] - 並檢索值:[myValue CGPointValue] –

+0

@DrummerB我還沒有 - 是最好的課程行動?我使用'[NSValue valueWithCGPoint:(CGPoint)point]' – Anthony

回答

2

這裏沒有必要使用迭代。 Cocos2d有一個名爲ccDrawPoly()的內置函數。您可以使用它像這樣:

CGPoint *verts = malloc(sizeof(CGPoint) * [points count]); 

for (int i = 0; i < [points count]; i++) { 
    verts[i] = [[points objectAtIndex:i] CGPointValue]; 
} 

ccDrawPoly(verts, [points count], NO); 

free(verts); 

顯然,如果您存儲CGPoints在C數組,而不是拳擊和NSValues拆箱他們,你會得到更好的性能,但如果你真的需要的可變性,即不能被幫助。

至於ccDrawPoly()第三個參數,將其設置爲YES將連接陣列的起點和終點,使一個封閉的多邊形,同時採用NO只會讓一堆線路的暢通。

+0

Cocos2D還實現了一個自定義的可變數組類,它比NSMutableArray更有效。我認爲它叫做ccArray。 – DrummerB

+1

@DrummerB它實際上叫做'CCArray',它在* some *的情況下比'NSMutableArray'稍快。但是,這不是一個完美的替代品。 [Here](http://www.learn-cocos2d.com/2011/11/depth-ios-cocos2d-performance-analysis-test-project/#array)是一些非常有用的性能測試。 –

+0

有趣,謝謝。 – DrummerB