Metal newBuffer с использованием байт
У меня есть основной вопрос о выделении новых буферов для металлических устройств. Большинство примеров кода, которые я вижу, создают MTLBuffer во время установки и не изменяют его. Но мне интересно, если данные вершин меняются при каждом вызове рендеринга, можно ли каждый раз создавать новый MTLBuffer (используя -[MTLBuffer newBufferWithBytes:length:option]) для отправки данных в шейдеры, работающие на GPU, ИЛИ, если MTLBuffer из заданный размер будет создан один раз, но его байты изменяются при каждом вызове рендеринга? Каков рекомендуемый путь согласно лучшим практикам?
1 ответ
Если это небольшой объем данных (до 4 КБ), я думаю, вы можете использовать setVertexBytes() и setFragmentBytes (): https://developer.apple.com/documentation/metal/mtlrendercommandencoder/1515846-setvertexbytes
Для больших объемов данных, которые изменяют каждый кадр, они рекомендуют использовать подход с тройной буферизацией, чтобы доступ последовательных кадров к буферу не мешал: https://developer.apple.com/library/content/documentation/3DDrawing/Conceptual/MTLBestPracticesGuide/TripleBuffering.html
Из этого туториала Вы узнаете, как настроить тройную буферизацию: https://www.raywenderlich.com/146418/metal-tutorial-swift-3-part-3-adding-texture
Это на самом деле похоже на третью часть руководства, но именно эта часть показывает настройку тройной буферизации в разделе "Повторное использование унифицированных буферов".
В чем я не уверен, так это в том, что лучше / быстрее использовать тройную буферизацию и для небольших объемов данных - они делают это в этом уроке только для пары матриц, так что, возможно, лучше всегда тройной буфер.