2012-06-30 44 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