我的代码如下 -
[[NSColor whiteColor] set];
// `path' is a bezier path with more than 1000 points in it
[path setLineWidth:2];
[path setLineJoinStyle:NSRoundLineJoinStyle];
[path stroke];
// some other stuff...
在Instruments中运行时间分析工具,它告诉我我的应用程序花费93.5%的时间在最后一行[path stroke]
,而Quartz Debugger告诉我我的应用程序仅以低于10 fps的速度运行(另一个视图改变它顶部的位置总是导致更新。
我正在寻找提高抚摸bezier路径性能的方法,有时候,超过1000点的路径会以> 60fps的速度快速绘制,但在某些极端情况下甚至可以使用相同数量的点,也许如果这些点相距太远(或者太密集了?),性能变得非常低迷。
我不确定我能做些什么。我认为将视图缓存为位图代表很有帮助,但它对实时调整大小无能为力。
编辑:注释掉[path setLineWidth:2];
行确实有帮助,但路径看起来真的太“瘦”。
答案 0 :(得分:6)
您可以使用setFlatness:方法调整曲线的平坦度,较高的值会提高渲染速度,但会牺牲精度。例如,您应该在实时调整大小期间使用更高的值。
答案 1 :(得分:3)
当我向Apple的Quartz 2D团队询问这个时,他们告诉我,用大量的点抚摸一条路径的性能的最大因素是路径与自身相交的次数。有很多工作可以解决交叉点的正确抗锯齿问题。
答案 2 :(得分:2)
你是否在每次抽奖时建立路径 - 它是否从绘图改为绘图?听起来确实有变化。如果你反复绘制相同的路径,可能会有缓存,所以尝试创建并保持它直到它发生变化。它可能有所帮助。
您还可以下载一两个API级别。也许CALayer对象可能会做你想要的。换句话说 - 你真的有1000点线需要弯曲来连接点吗?你可以做一堆CALayer对象来绘制线段。
这些处理器的数学运算速度很快。你也可以编写一个数学例程来抛出不需要的点,将数字从1000减少到大约200左右。数学会试图消除相近的点等。
我的赌注是数学上扔掉没有任何视觉差异的点。平坦的事情听起来也很有趣 - 可能是因为完全平坦,你正在做线段。
答案 3 :(得分:0)
当你说
时,你是什么意思另一个观点在顶部改变位置 它始终导致更新
...
你的意思是你没有以60fps的速度重绘视图吗?那就是为什么你没有看到60fps的原因。
何时
它告诉我我的应用程序的仪器 花费93.5%的时间
做某事,并不意味着'所有可用'时间意味着你的应用消耗了93.5%的cpu周期。也就是说,它可能没有时间。仅仅确定您需要进行优化是不够的。我不是说你不需要,或者说抚摸大规模的beziers并不是狗慢。仅仅这一点并不意味着什么。