Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 在NSScrollView的内容视图中多次调用drawRect:_Macos_Cocoa_Drawrect_Nsscrollview - Fatal编程技术网

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

Macos 在NSScrollView的内容视图中多次调用drawRect:,macos,cocoa,drawrect,nsscrollview,Macos,Cocoa,Drawrect,Nsscrollview,我正在设计一个类似Quartz Composer的界面,用户可以用电线连接节点。节点是NSView的子类,导线在画布上绘制为NSBezierPaths(也是NSView的子类),位于-drawRect:中。画布放置在NSScrollView中 我面临画布视图重画的问题。当画布视图需要重新绘制时(-setNeedsDisplay:或-setNeedsDisplayInRect:),会对-drawRect:进行多次调用,而不是像人们所期望的那样调用一次。这会显著减慢画布的重画速度。我已经对bezie

我正在设计一个类似Quartz Composer的界面,用户可以用电线连接节点。节点是
NSView
的子类,导线在画布上绘制为
NSBezierPaths
(也是NSView的子类),位于
-drawRect:
中。画布放置在
NSScrollView

我面临画布视图重画的问题。当画布视图需要重新绘制时(
-setNeedsDisplay:
-setNeedsDisplayInRect:
),会对
-drawRect:
进行多次调用,而不是像人们所期望的那样调用一次。这会显著减慢画布的重画速度。我已经对bezier路径的绘制做了一些优化,但这种多次重画的做法仍然在扼杀我的性能(因为路径仍然需要以最短的速度显示出来)

以下是在单个
-setNeedsDisplayInRect:
调用之后,
-drawRect:
中出现的
NSRect
的日志:

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 x 813(第一次更新)是视口的实际大小,但我不知道其余的更新来自何处,也不知道大小和位置(事实上,一些矩形重叠)

此后,我检查并再次检查了我的代码,没有对任何绘图函数的冗余调用,只有对
-setNeedsDisplayInRect:
的一次调用

以下是我的问题:

  • 为什么会这样

  • 我想改变这种行为,每次通话只更新一次。我怎样才能做到这一点

  • 或者,至少,是否有办法知道这些更新的“组”何时开始(以便更有效地规划图形)

  • 任何处理这一问题的替代战略/建议都将非常受欢迎


  • 谢谢

    这可能是由于。遗憾的是,解释的10.9 AppKit发行说明没有在线(当前的说明是针对10.10的,旧的说明没有添加10.9)。总的来说,您是否尝试过中的优化策略?谢谢您的回复。是的,根据你链接的指南,我已经做了几乎所有要做的事情。但这并不是关于绘图时间本身(根据我的标准,这是可以接受的),而是关于NSView令人费解的更新习惯。我看了一下关于响应式滚动的内容,但这似乎不是根本原因,因为我。只有当应用程序能够保持60帧/秒(在我的情况下显然不是这样)时,响应式滚动才会生效。它发生在后台线程中(也不是这样,因为所有绘图都发生在主线程中)。