具有高分辨率图像的NSImageView在调整窗口大小时会导致极度减速

时间:2013-11-02 16:59:29

标签: objective-c macos nsimage nsimageview

我正在为OS X创建一个简单的照片过滤器应用程序,我正在NSImageView上显示一张照片(实际上有两张照片在彼此的顶部,有两个NSImageView,但问题仍然适用对于单一视图也是如此)。一切都很有效,但当我尝试调整包含NSImageView的窗口的大小时,窗口(也会调整NSImageView的大小)调整速度非常慢,大约不到1fps,造成负面影响关于用户体验。我希望调整窗口尽可能平滑。当我禁用调整图像视图的大小时,窗口会平滑地调整大小,因此减速的原因是那些NSImageView s。

我正在从我的数码单反相机上加载20万像素的图像。当我将它们缩小到合理的屏幕尺寸(例如1024x768)时,它们可以平滑地缩放,因此问题在于NSImageView呈现图像的方式。它(我假设这种行为的结果)每次需要将其重绘为视图的目标帧时,都会尝试重新渲染20MP图像。

如何让NSImageView重新缩放更顺畅?我应该用缩小版的图像来喂它吗?我不想这样做,因为它是一个照片编辑应用程序,也针对视网膜显示屏幕,视口实际上会非常大。我能做到,但这是我的最后选择。除了按比例缩小之外,如何让NSImageView更快地调整大小?

1 个答案:

答案 0 :(得分:4)

我相信您正在寻找的部分解决方案是在NSImage的表示中。您可以使用addRepresentation为图像添加许多表示:我相信在绘制时会进行一些智能选择。在您的情况下,我认为您需要将两个表示(缩小和全分辨率位图)添加到NSImage。我强烈怀疑drawRect:应该选择低分辨率版本。我会确保在NSImageView中选择“向上或向下扩展”,因为默认情况下仅缩小,这可能会强制在大多数时间使用全分辨率图像。在NSImage的“设置图像表示选择标准”下,Apple的文档中有关于“匹配”的讨论,尽管乍一看这可能还不够。

然后,每当您需要对整个图像执行某些操作时,您将通过遍历表示来请求全分辨率图像([NSImage表示]返回NSImageRep数组)。