我正在基于Metal构建图像查看器,目前正在尝试加载一些较大的图像(70,000 x 24,000像素)。图像被加载到多个MTLTextures
中,每种类型为MTLTextureType2DArray
。
金属似乎正在创建纹理并分配所需的内存,因为Xcode报告我的应用程序使用了9 GB以上的内存。在具有16GB内存的13英寸MBP上,我显然没有9GB的GPU用于所有这些纹理,因此我假设Metal正在使用系统内存进行分配吗?
但是,当需要执行渲染过程时,Metal在我请求当前渲染过程描述符时立即抛出Insufficient Memory
错误。
如何管理纹理分配,以使我不超过任何金属或系统限制?显然,在某些图像大小下,我需要从将整个图像加载到内存中切换到一种基于图块的方法,但是根据GPU和RAM的不同,在一台计算机之间也会有所不同。
我本以为分配新纹理会在某个时候开始失败,但是我似乎能够分配足够的图像来覆盖宽度为70,000像素和高度为24,000像素(BGRA8
)的图像,但是渲染过程发生时,相同的分配会导致内存错误。
编辑#1:
我刚刚意识到,当对纹理使用MTLStorageModeManaged
时,在渲染过程中将纹理分配给片段索引时,Metal仅需要更新纹理的视频内存表示。如果我没有分配所有纹理,那么我的内存不足错误就会消失,因为大概有足够的视频内存可供Metal分配可绘制对象。
这表明我可以拥有与系统内存一样多的纹理数据,但是我需要注意在渲染过程中我访问了多少纹理数据,以免耗尽可用的视频内存。
Xcode控制台错误:
由于执行期间发生错误,命令缓冲区的执行被中止。内存不足(IOAF代码8)
堆栈跟踪:
内存量规: