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

内存量规:

发布于 2018-11-30 20:13:00
使用以下指导方针确定特定纹理的适当存储模式。
https://stackoverflow.com/questions/53563530
复制相似问题