您如何处理Metal中的超大图像?

时间:2018-08-06 20:08:15

标签: macos cocoa metal metalkit

TL; DR:在macOS 10.13中,MTLTexture的最大宽度和高度为16,384。您可以使用什么策略使用Metal处理和显示大于16,384像素的图像?

在我当前正在使用的照片查看器中,我已将大部分图像查看移至使用Core Image进行任何图像调整的金属背景视图中。这确实工作得很好,但是我最近开始针对一些非常大的图像(全景图像)进行测试,但现在遇到了一些限制,我不确定在保持相对性能的同时如何解决。

我当前的环境如下:

  • NSURL加载图像并将其解码为IOSurface。这可以直接使用Image IO或渲染到IOSurface的Core Image管道来完成。然后,IOSurface从XPC服务传递回主应用程序。

  • 在主应用中,创建了一个新的MTLTexture,并由IOSurface支持。然后,从CIImage创建一个MTLTexture,并将CIImage用作整个图像管线的根“源图像”。

但是,如果我尝试打开一维大于16384像素的图像,则无法在笔记本电脑上创建原始的IOSurface 16,384。 (13英寸MBP-TB 2016)

但是,即使我可以创建更大的IOSurface,也仍然会在MTLTexture上设置相同的限制。

请参阅:Apple's Metal Feature Table Set

我很好奇其他人会建议哪些策略允许一个人打开大型图像文件,同时仍然利用Core Image和Metal。

我所做的一种尝试是使根源映像是使用CIImage创建的CGImageRef。但是,对于更小尺寸的图像,在这种排列和由纹理支持的CIImage之间的性能会大大降低。

我曾经但尚未探索过的另一个想法是以某种身份使用CIImageProvider,但我不确定要如何“平铺”潜在的几个{{1} }或IOSurfaces,如果这样甚至有意义,或者只分配一个大的缓冲区以供读取会更好。 (或者以某种身份使用MTLTextures?)

(macOS 10.13甚至10.14都可以。)

0 个答案:

没有答案