NSView -drawRect和鼠标悬停性能

时间:2014-04-21 20:24:55

标签: macos performance cocoa quartz-graphics

我有一个自定义NSView绘制(带有-drawRect)图形。它还跟踪鼠标位置(使用-mouseMoved等)并绘制相对于轴的光标位置/坐标。

图形很大并且(可能)绘制缓慢,并且不依赖于鼠标位置。鼠标悬停效果很小,并且总是快速绘制。当鼠标移动几个像素时,我不想重绘所有内容,因为它感觉很迟钝。

我确定我可以创建自己的私有图形上下文(如果在2倍显示器上增加一倍),将图表数据绘制到那一次,然后让-drawRect简单地将其插入到查看图纸上下文。或者,我可以将我的NSView子类拆分为两个类,并且只有一个图表数据,一个只是叠加层,并将它们完全放在彼此之上(尽管它们必须共享一些数据,所以这看起来很尴尬)。

是否有内置的方法可以让这更容易,还是有一种更惯用的处理方法?

1 个答案:

答案 0 :(得分:0)

看看这些NSWindow方法:

包围绘图操作 - cacheImageInRect: - restoreCachedImage - discardCachedImage

通常,使用视图,您可以定义一个drawRect:方法,该方法可以按需绘制内容。但是,您可以根据事件在视图中进行现场绘制,例如,将焦点锁定在视图上,执行绘图,然后解锁焦点。在这个现场绘图中缺少的链接,在某种程度上撤消它而不调用你可能很重的drawRect:via setNeedsDisplay:

这是NSWindow的Bracketed绘图操作发挥作用的地方。在将焦点锁定在视图上并进行一些现场绘制之前,请在要绘制的区域中缓存视图的图像。当您下次想要更新图形时(可能跟踪事件),然后恢复缓存的图像,冲洗并重复。