我有一组金属纹理作为纹理集存储在Xcode Assets目录中 . 我正在使用 MTKTextureLoader.newTexture(name:scaleFactor:bundle:options)
加载这些 .
然后我使用 MTLArgumentEncoder
将所有纹理编码为Metal 2参数缓冲区 .
这很好用 . 然而,2017年WWDC金融时报 Session recommends combining argument buffers with resource heaps for even better performance,我非常渴望尝试这一点 . 根据Argument Buffer documentation,不必在参数缓冲区中的每个纹理上调用 MTLRenderCommandEncoder.useResource
,而只需在分配纹理的堆上调用 useHeap
.
但是,我还没有找到一种直接使用 MTKTextureLoader
和 MTLHeap
的方法 . 它似乎没有一个加载选项来从堆中分配纹理 .
我猜这个方法是:
-
用
MTKTextureLoader
加载纹理 -
为每个纹理反向设计一组
MTLTextureDescriptor
对象 -
使用纹理描述符来创建适当大小的
MTLHeap
-
从
MTLHeap
分配一组新纹理 -
使用一些方法来复制纹理,也许
replaceBytes
甚至可能是MTLBlitCommandEncoder
-
释放用
MTKTextureLoader
加载的原始纹理
这似乎是一个相当冗长的方法,我没有看到任何这样的例子,所以我想我先问这里,以防我错过了一些明显的东西 .
我应该放弃 MTKTextureLoader
,并在从资产目录中加载纹理时搜索一些前MetalKit艺术品吗?
我正在使用Swift,但很高兴接受Objective-C的答案 .
1 回答
好吧,我上面概述的方法似乎有效 . 正如预测的那样,它非常啰嗦 . 我很想知道是否有人有更优雅的东西 .