多次调用drawRect:在NSScrollView的内容视图中

时间:2014-11-06 14:18:54

标签: macos cocoa drawrect nsscrollview

我正在设计一个类似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:

以下是我的问题:

  1. 为什么会这样?

  2. 我想改变这种行为,每次调用只有一次更新。我怎样才能做到这一点?

  3. 或者,至少,有没有办法知道这些更新的“组”何时开始(以便更有效地规划绘图)?

  4. 处理此问题的任何其他策略/建议都非常受欢迎。

  5. 由于

0 个答案:

没有答案