在一个简单的绘图应用程序中,我有一个模型,其中NSMutableArray
curvedPaths
包含用户绘制的所有行。一条线本身也是NSMutableArray
,包含点对象。当我绘制弯曲的NSBezier
路径时,我的点阵列具有以下结构:linePoint,controlPoint,controlPoint,linePoint,controlPoint,controlPoint等...我认为有一个数组包含所有点加控制点会更多比处理2个或3个不同的阵列更有效。
显然我的视图绘制了从模型中获取的路径,这导致了实际的问题:有没有办法在速度方面优化以下代码(在视图的drawRect方法内)?
int lineCount = [[model curvedPaths] count];
// Go through paths
for (int i=0; i < lineCount; i++)
{
// Get the Color
NSColor *theColor = [model getColorOfPath:[[model curvedPaths] objectAtIndex:i]];
// Get the points
NSArray *thePoints = [model getPointsOfPath:[[model curvedPaths] objectAtIndex:i]];
// Create a new path for performance reasons
NSBezierPath *path = [[NSBezierPath alloc] init];
// Set the color
[theColor set];
// Move to first point without drawing
[path moveToPoint:[[thePoints objectAtIndex:0] myNSPoint]];
int pointCount = [thePoints count] - 3;
// Go through points
for (int j=0; j < pointCount; j+=3)
{
[path curveToPoint:[[thePoints objectAtIndex:j+3] myNSPoint]
controlPoint1:[[thePoints objectAtIndex:j+1] myNSPoint]
controlPoint2:[[thePoints objectAtIndex:j+2] myNSPoint]];
}
// Draw the path
[path stroke];
// Bye stuff
[path release];
[theColor release];
}
谢谢, xonic
答案 0 :(得分:4)
嘿xon1c,代码看起来不错。通常,如果不在特定情况下测量性能,则无法进行优化。
例如,假设上面的代码只被调用过一次。它在视图中绘制图片,从不需要重绘。假设上面的代码需要50毫秒才能运行。您可以在openGL中重写它并在阳光下进行每次优化并将时间缩短到20毫秒,实际上您保存的30毫秒对任何人都没有影响,而您几乎浪费了时间并添加了大量代码 - 膨胀将更难以维持。
但是,如果上面的代码每秒调用50次,并且大部分时间它都绘制相同的东西,那么你可以有意义地优化它。
当谈到绘图时,优化的最佳方法是消除不必要的绘图。
每次绘制时都会重新创建NSBezierPaths - 它们总是不同吗?您可能希望维护要绘制的NSBezier路径列表,使其与模型保持同步,并保持绘图仅用于绘制路径。
您是否正在绘制视图中不需要重绘的区域? drawrect的参数是需要重绘的视图区域 - 你可以测试它(或getRectsBeingDrawn:count :),但在你的情况下,你知道需要重新绘制整个视图。
如果路径本身不经常更改,但视图需要经常重绘 - 例如,当路径的形状没有改变但是它们的位置是动画并且它们以不同的方式重叠时,您可以绘制到图像的路径(纹理)然后在内部绘制,你会将纹理绘制到视图而不是绘制视图的路径。这可以更快,因为纹理只创建一次并上传到视频内存,绘制到屏幕更快。如果这是你需要的,你应该看看Core Animation。
如果您发现绘制路径太慢,可以查看CGPath
所以,总的来说,它确实取决于你在做什么。与以往一样,最好的建议是不要陷入过早的优化。如果您的应用对用户来说实际上并不太慢,那么您的代码就可以了。