什么是优化NSImageView和NSView滚动性能的正确方法

时间:2018-08-15 00:22:43

标签: macos calayer nsview

我需要提高视图的滚动性能,以便在图像顶部进行注释。

目前,我有以下内容:

- annotationView (custom NSView)
- imageView (NSImageView)
- contentView (custom NSView)
- clipView (NSClipView)
- scrollView (NScrollView)

图像是相当大的PDF和PNG,除非我支持imageView图层,否则滚动效果很差,这只是我在Interface Builder中所做的。这样滚动就很流畅了。

但是,PNG图像会覆盖imageView顶部的所有内容,而PDF图像会正确保留在背景中。

这是为什么,我该如何解决?

为了获得更好的性能,我还希望同时支持annotationView层,但是如果这样做,则整个视图将变黑-除了在notationView上绘制注释之外。我如何使此后层视图透明,但仍允许在其上绘制形状。看来我可以使它透明,但随后所有东西都变得透明,包括绘制的形状。

是否有更好的方法来实现这一目标?注释只是形状和文本,需要放置在图像上的特定位置上,而我目前只是根据鼠标位置来绘制这些图像。

1 个答案:

答案 0 :(得分:0)

简短的答案是使用支持图层的视图,并使用CGContext进行绘制,而不是使用简单的NSView绘制API。

与iOS不同,默认情况下,macOS不使用基于GPU的图形。

macOS提供了高级API,该API使用CPU而非GPU进行图形操作。

因此,在我的情况下,我将所有内容都切换为layer backed NSViews-您可以在Interface Builder中进行设置,也可以在wantsLayer = true初始化代码(NSView中简单地添加'init()'

避免使用NSImageView,而是使用支持图层的视图并设置layer.content = NSIMage,您可能还必须设置图层的背景色,或者在滚动时可能无法清除背景的某些区域

这对我有用-我的背景中有大PDF图像-建筑布局,并在该视图的上方有一个层支持的视图,用于放置注释。

现在滚动可以很顺滑。图片似乎会立即加载。

在大多数情况下,这非常容易-只需从一开始就进行设置即可,省去了很多麻烦。

相关问题