Почему будет 8000 материалов?
Graphics.DrawMeshInstanced — рисует сетку с одним материалом много раз. На этапе регистрации отрисовки мы передаем позиции, поворот и кадр для каждого обьекта. А дальше уже видеокарта рисует эти обьекты. В вершинной функции выставляем персонажа в нужную позу и точку пространства.
За счет того что мы используем DrawMeshInstanced а не по отдельности выставляем позу для каждого обьекта и получаем экономию. B основе этого подхода лежит техники рисования растительности (деревьев, травы).
И на скришотах вы можете посмотреть что для стандартного подхода получаем 3651 батч а для GPU instance — 11
Есть такая библиотека которая не генрит много мусора как стандартная LINQ, и оптимизирована для работы с UNITY: smooth.foundations
Но в вашем случае лучше использовать IndexOf дабы не добавлять зависимости
StructiredBuffer поддерживается только ComputeShader-ом. Я не совсем понимаю как это должно работать на ComputeShader. Возможно вы могли бы предоставить пример.
Спасибо
— Эта техника будет хорошо работать если у нас одна моделька с одним материалом. На сторону шейдера мы передаем массивы позиций, поворотов и ключ к кадру. Поскольку все анимации сохранены в одной текстуре последовательно, нам ничто не мешает для разных объектов отсылать разные ключи. Следовательно часть объектов может быть в одной анимации, а часть в другой. И производительность не должна пострадать.
— Состояние анимации, а также позиция и поворот каждый кадр рассчитывается на стороне процессора.
— Я думаю эта техника будет полезна в RTS когда нам нужно рисовать большое количество юнитов.
Graphics.DrawMeshInstanced — рисует сетку с одним материалом много раз. На этапе регистрации отрисовки мы передаем позиции, поворот и кадр для каждого обьекта. А дальше уже видеокарта рисует эти обьекты. В вершинной функции выставляем персонажа в нужную позу и точку пространства.
За счет того что мы используем DrawMeshInstanced а не по отдельности выставляем позу для каждого обьекта и получаем экономию. B основе этого подхода лежит техники рисования растительности (деревьев, травы).
И на скришотах вы можете посмотреть что для стандартного подхода получаем 3651 батч а для GPU instance — 11
smooth.foundations
Но в вашем случае лучше использовать IndexOf дабы не добавлять зависимости
Спасибо
ComputeShader нужен для произведения расчетов без отрисовки результата на экран.
— Эта техника будет хорошо работать если у нас одна моделька с одним материалом. На сторону шейдера мы передаем массивы позиций, поворотов и ключ к кадру. Поскольку все анимации сохранены в одной текстуре последовательно, нам ничто не мешает для разных объектов отсылать разные ключи. Следовательно часть объектов может быть в одной анимации, а часть в другой. И производительность не должна пострадать.
— Состояние анимации, а также позиция и поворот каждый кадр рассчитывается на стороне процессора.
— Я думаю эта техника будет полезна в RTS когда нам нужно рисовать большое количество юнитов.