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都可以。)