Войти
ПрограммированиеФорумГрафика

Unity3D grass: проблемы с производительностью

#0
13:28, 1 дек. 2019

Вривет всем!
Разбираюсь с тем как работает трава в Unity.
Есть префаб (модель земли (не террейн)) и нужно разместить на этой модели земли траву.
Скачал какую-то open-source траву из сети и обнаружил, что префаб травы кроме MeshRenderer и MeshFilter содержит еще и скрипт Tree.
Так вот, если перенести траву из папки с префабами в сцену(то есть создается копия обьекта, у которой родительский префаб - этот тот, что лежит в папке) и покрутить ползунки, то почему-то префаб травы(родительский префаб) в папке с префабами меняется. Это выглядит так, будто я редактирую префаб.
И это происходит только с травой, другие обьекты не ведут себя так.

1) Можно ли как-то такую траву размещать на моделях (разумеется она должна эффективно рисоваться) или она предназначена только для террейнов?

Ну да ладно, попробовал разместить траву на террейне (с помощью кисти) и не могу понять по какому закону меняется параметр Batches в окне Stats. В каких-то случаях (камера далеко от травы) я мог рисовать несколько разновидностей травы и Batches увеличивался на 1 или 2. Хз из-за чего увеличение было как минимум не на количество разных материалов, которые рисуются в сцене.
Если подлететь к траве поближе, и рендерить траву с одинаковым материалом, то почему-то Batches = 44, вместо 3. Я посчитал число кустов в кадре, их примерно столько же сколько и Batches. Он что, чтобы отрисовать каждый куст перенастраивает конвеер??? Оно должно же батчиться??? Выставил на материале галку GPU Instancing, не помогло:

+ Показать

Обьясните, что из себя представляет трава в unity, почему она не батчится? Как бы вы посоветовали размещать траву на меше (делать уникальную модель травы с одним общим материалом)?


#1
23:43, 1 дек. 2019

Видимо скрипт Tree генерит сам меш травы и по этому, параметр изменяемый в объекте, меняет также и траву в префабе. А не батчися он потому, что это множество разных мешей.

#2
12:54, 2 дек. 2019
Юнити - это сама по себе одна большая проблема с производительностью.
#3
19:14, 2 дек. 2019

Здесь конечно на Tarrain-e трава, но разницы думаю не будет. С динамическим батчингом вроде все ок. Но почему-то включение SRP batching и GPU instancing разрушает весь батчинг.

+ Показать

#4
(Правка: 21:14) 20:15, 2 дек. 2019

Alerr
> Обьясните, что из себя представляет трава в unity, почему она не батчится?

Батчить траву в каждом кадре нет смысла. Индивидуальные плашки травы заранее собираются в большие «патчи», которыми они рендерятся одновременно за один draw call. Во Frame Debugger'е видно, как трава рендерится большими квадратами. За размер «патча» отвечает настройка TerrainData.detailResolutionPerPatch. В редактор она тоже вынесена:
grass | Unity3D grass: проблемы с производительностью

В один «патч» входит не просто много плашек травы, а много плашек многих видов травы ― индивидуальные текстурки автоматически объединяются в атлас.

Если настройки террейна не подбирать аккуратно, а лепить от фонаря, вполне можно получить ситуацию, когда размер «патча» окажется таким маленьким, что в него будет попадать по одной-две редкие травинки.

ПрограммированиеФорумГрафика