Оптимальная стратегия для буферов экземпляров на Directx11 и Metal - PullRequest
0 голосов
/ 02 ноября 2019

У меня есть приложение, которое рендерит много экземпляров на кадр. Типичная сцена содержит 200-400 объектов. Обычно около 40% объектов имеют менее 10 экземпляров, еще 40% объектов имеют менее 100 экземпляров, но последние 20% могут быть объектами с 20000 экземплярами или около того. Для каждого экземпляра мне нужно передать матрицу, которая содержит масштаб, местоположение и вращение. Каждый кадр перед установкой моих буферов экземпляров я определяю, какие экземпляры отбирать, а какие передавать рендереру. Это означает, что количество экземпляров для любого объекта в любом кадре может значительно различаться.

Мой вопрос: какова оптимальная стратегия управления буферами экземпляров.

Одной из стратегий было бы выделение буфера для каждого объекта, достаточно большого для размещения всех экземпляров в том случае, если все они будут нарисованы. Но если бы только половина экземпляров была нарисована во фрейме, обновление буфера было бы бесполезным.

Другая стратегия может заключаться в том, чтобы выделить пул буферов различных размеров, а когда пришло время рисовать объект, определитьсколько экземпляров не было отбраковано, а затем извлекает буфер достаточного (но не слишком большого размера) из пула и использует его.

Одна из вещей, которые я не знаю, это то, насколько дорогим является повторное использованиеиспользовать буфер в пределах одного кадра. Скажем, я рисую 100 экземпляров objectX, но затем в том же кадре повторно использую буфер экземпляров для рисования 100 экземпляров objectY, это вызывает остановку? Или буфер копируется куда-то (в драйвере?) И я использую тот же или другой буфер для последовательных отрисовок в одном и том же кадре?

В аналогичной теме я должен быть двойной / тройной буферизациейбуферы экземпляра, как я делаю с буферами команд?

Мое приложение работает в обоих окнах с использованием DirectX11 и на iOS с использованием Metal.

...