我正在设计一个类似Quartz Composer的界面,用户可以使用连线连接节点。节点是NSView
的子类,并且在NSBezierPaths
中,画布(也是NSView的子类)上的导线被绘制为-drawRect:
。画布放在NSScrollView
内。
我正面临着画布视图重绘的问题。当需要重新绘制画布视图(-setNeedsDisplay:
或-setNeedsDisplayInRect:
)时,会发生几次调用-drawRect:
,而不是单个调用,正如人们所期望的那样。这会显着减慢画布的重绘速度。我已经对贝塞尔路径的绘制进行了相当多的优化,但是这种多次重绘仍然会影响我的性能(因为路径仍然需要通过blit来显示屏幕)。
以下是NSRect
来自-drawRect:
后的-setNeedsDisplayInRect:
的日志:
Origin: 245.783616, 410.382009; Size: 740.000000, 813.000000
Origin: 768.000000, 410.000000; Size: 218.000000, 102.000000
Origin: 512.000000, 410.000000; Size: 256.000000, 102.000000
Origin: 256.000000, 410.000000; Size: 256.000000, 102.000000
Origin: 245.000000, 410.000000; Size: 11.000000, 102.000000
740 by 813(第一次更新)是我的视口的实际大小,但我不知道其他更新的来源,也不能理解大小和位置(事实上,一些矩形重叠)。
我已检查并仔细检查了我的代码,并且没有对任何绘图功能的冗余调用,只需调用-setNeedsDisplayInRect:
。
以下是我的问题:
为什么会这样?
我想改变这种行为,每次调用只有一次更新。我怎样才能做到这一点?
或者,至少,有没有办法知道这些更新的“组”何时开始(以便更有效地规划绘图)?
处理此问题的任何其他策略/建议都非常受欢迎。
由于