macos - 您如何在 Metal 中处理非常大的图像?
问题描述
TL;DR:在 macOS 10.13 中,anMTLTexture
的最大宽度和高度为 16,384。您可以使用哪些策略来使用 Metal 处理和显示大于 16,384 像素的图像?
在我目前正在使用的照片查看器中,我已将大部分图像查看移动到使用 Core Image 进行任何图像调整的 Metal 支持的视图中。这工作得很好,但我最近开始对一些非常大的图像(全景图)进行测试,现在我遇到了一些限制,我不完全确定如何在保持相对性能的同时解决问题。
我现在的环境是这样的:
将图像从 加载和解码
NSURL
到IOSurface
. 这是通过直接使用 Image IO 或渲染到IOSurface
. 然后IOSurface
从 XPC 服务传递回主应用程序。在主应用程序中,
MTLTexture
创建了一个由IOSurface
. 然后,CIImage
从MTLTexture
和创建一个CIImage
在整个图像管道中用作根“源图像”的和。
但是,如果我尝试在一个维度上打开大于 16,384 像素的图像,则无法在我的笔记本电脑上创建原始的 IOSurface 16,384。(13" MBP-TB 2016)
但是,即使我可以创建一个更大IOSurface
的MTLTexture
.
请参阅:Apple 的金属功能表集
我很好奇其他人会推荐什么策略来允许一个人打开大图像文件,同时仍然利用 Core Image 和 Metal。
我所做的一个尝试是让根源图像成为一个CIImage
用CGImageRef
. CIImage
但是,这种排列方式与更小尺寸图像的纹理支持之间的性能显着下降。
我有但尚未探索的另一个想法CIImageProvider
是以某种容量使用,但我不完全确定我将如何“平铺”潜在的几个IOSurfaces
or MTLTextures
,如果这甚至有意义或者它是否会最好只分配一个大缓冲区来读取。(或者也许dispatch_data
以某种身份使用?)
(macOS 10.13 甚至 10.14 都可以。)
解决方案
推荐阅读
- html - 我希望当我单击此按钮时被定向到另一个控制器中的另一个操作方法
- python - 在 NetworkX 中向具有相同名称、不同属性的节点添加边
- oracle-sqldeveloper - SQL Developer:将列名拖放到工作表中
- mongodb - 无法使用自签名证书连接到 mongodb,docker 容器中的 mongodb
- javascript - 基于Javascript中的两个数组创建新的对象数组
- postgresql - 在 Activerecord Select 语句中获取动态列值
- sql - 找到超过平均值的部门。没有 emps 正在运行 SQL
- security - 列表与增量值安全性
- r - 根据R中的值条件从矩阵中提取列/行名称
- python - 从匹配至少 n 个条件的 pandas 数据框中获取行?