У меня есть набор текстур металла, которые хранятся в каталоге активов Xcode как наборы текстур. Я загружаю их с помощью MTKTextureLoader.newTexture(name:scaleFactor:bundle:options)
.
Затем я использую MTLArgumentEncoder
для кодирования всех текстур в буфер аргументов Metal 2.
Это прекрасно работает. Однако сессия Знакомство с Metal 2 WWDC 2017 рекомендует комбинировать буферы аргументов с кучей ресурсов для еще большей производительности, и я очень хочу попробовать это. Согласно документации по буферу аргументов вместо вызова MTLRenderCommandEncoder.useResource
on для каждой текстуры в буфере аргументов вы просто вызываете useHeap
в куче, из которой были выделены текстуры.
Однако я не нашел простого способа использовать MTKTextureLoader
вместе с MTLHeap
. Кажется, у него нет возможности загрузки для выделения текстуры из кучи.
Я предполагаю, что подход будет следующим:
- загрузить текстуры с
MTKTextureLoader
- реконструировать набор из
MTLTextureDescriptor
объектов для каждой текстуры - используйте дескрипторы текстуры для создания
MTLHeap
подходящего размера - назначить новый набор текстур из
MTLHeap
- используйте какой-нибудь метод для копирования текстур, возможно
replaceBytes
или дажеMTLBlitCommandEncoder
- освободить исходные текстуры, загруженные с
MTKTextureLoader
Это кажется довольно длинным подходом, и я не видел никаких примеров этого, поэтому я подумал, что сначала спрошу здесь, если мне не хватает чего-то очевидного.
Должен ли я отказаться от MTKTextureLoader
и поискать искусство, существовавшее до MetalKit, при загрузке текстур из каталогов ресурсов?
Я использую Swift, но с радостью принимаю ответы Objective-C.