macos - 优化 NSImageView 和 NSView 滚动性能的正确方法是什么
问题描述
我需要提高视图的滚动性能,以便在图像顶部进行注释。
目前我有以下内容:
- annotationView (custom NSView)
- imageView (NSImageView)
- contentView (custom NSView)
- clipView (NSClipView)
- scrollView (NScrollView)
这些图像是相当大的 PDF 和 PNG,除非我支持 imageView 层,否则滚动效果很差,我只是在 Interface Builder 中这样做。然后滚动非常流畅。
然而,PNG 图像覆盖了 imageView 之上的所有内容,而 PDF 图像正确地保留在背景中。
为什么会这样,我该如何解决?
为了获得更好的性能,我还想支持 annotationView 层,但如果我这样做,整个视图都会变黑 - 除了在 annotationView 上绘制的注释。如何使该图层支持的视图透明但仍允许在其上绘制形状。似乎我可以让它透明,但随后一切都变得透明,包括绘制的形状。
有没有更好的方法来实现这一目标?注释只是需要放置在图像上特定位置的形状和文本,我目前只是根据鼠标位置进行绘制。
解决方案
简短的回答是使用图层支持的视图并CGContext
用于绘图,而不是更简单的NSView
绘图 API。
默认情况下,macOS 不使用基于 GPU 的图形,这与 iOS 不同。
macOS 提供了一个高级 API,它使用 CPU 而不是 GPU 进行图形操作。
因此,在我的情况下,我将所有内容都切换为layer backed NSViews
- 您可以在 Interface Builder 中设置它,或者只需wantsLayer = true
在NSView
初始化代码 ( init()
) 中添加 ' '。
避免使用NSImageView
,而是使用图层支持的视图并设置layer.content = NSIMage
,您可能还必须设置图层背景颜色,否则您可能会在滚动时获得一些背景区域未清除。
这对我有用 - 我在背景中有大的 PDF 图像 - 构建布局和一个图层支持的视图,用于放置注释。
滚动现在非常流畅。图像似乎立即加载。
在大多数情况下,它非常容易 - 只需从一开始就设置好,省去很多麻烦。
推荐阅读
- html - 如何将函数参数用作猫鼬查询?
- php - 如何使用我自己的网址创建重定向链接?
- angular - ng update 错误 request@2.88.2 和 npm-packlist
- python-3.x - 使用 OpenCV Python 进行不同人数统计
- java - Android:无法返回值
- c - 为什么 pthread_join 不阻塞并等待线程完成?
- java - 使用快速/慢速 ptrs 找到链表的中间,当我不应该出现 nullptr 错误时(fast.next.next 检查)
- coldfusion - Coldfusion Query OF Query 生成的记录多于预期
- sql - 从另外两个表插入到一个表中
- django - 上传图片时基于id/用户名的Django动态文件夹名称