Как игра Rust размещает миллионы травы, камней и деревьев

Rust имеет миллионы и миллионы экземпляров травы, камней и деревьев на своих картах, которые достигают размера 8 км.

Эта трава динамически размещается вокруг игрока во время выполнения? Если да, то это как-то делается на графическом процессоре или с помощью шейдера?

В моей игре мы используем цвета вершин и raycasting для размещения растительности, а также сохраняем данные преобразования, которые инициализируются косвенным инстансом GPU во время выполнения.

Однако я не могу представить, что это будет хорошо масштабироваться с чем-то вроде деревьев. Действительно ли в сцене постоянно активны тысячи меш-коллайдеров? Я подумал, что, возможно, они могли бы хранить все эти меш-коллайдеры в сцене, а игровой объект можно было бы пометить, и если вы нажмете на него инструментом, он добавит к нему компонент Tree.

Я иду в правильном направлении с созданием всего заранее, например, во время выполнения?

Я проверил это, и это действительно сработало, создав 24 миллиона экземпляров (на raycast ушло 20 минут), а затем инициализировал GPU с экземплярами.

Это круто и все такое, даже несмотря на то, что через некоторое время мой редактор Unity падает (утечка памяти?).

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

Но меня беспокоит, что если я попытаюсь сохранить хотя бы 10 000 игровых объектов (для взаимодействия, таких вещей, как рубимые деревья, добываемые камни), производительность упадет.


person Aaron Michael Frost    schedule 28.05.2021    source источник
comment
Они могут использовать один из приемов: billboarding. Вы также хотели бы сделать все статическим и запечь отсечение окклюзии.   -  person TEEBQNE    schedule 29.05.2021


Ответы (1)


Вы сами можете увидеть это в коде: https://github.com/Facepunch/Rust.World/blob/master/Assets/Scripts/WorldExample.cs

Игра загружает экземпляры в память или также может передавать экземпляры в потоковом режиме, но вы никогда не будете иметь все сборные экземпляры одновременно в GO, поскольку отбраковка/фрагменты необходимы для поддержания производительности (а не сбоя вашей программы).

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

Совет, если вы заинтересованы в таких системах, состоит в том, чтобы изучить ECS для единства, поскольку он предлагает более легкий способ создания экземпляров данных: https://docs.unity3d.com/Packages/[email protected]/manual/index.html

Таким образом, вы можете иметь тысячи инстансов объектов за небольшую часть того, что предлагают Game Objects по размеру и производительности.

Я также не хочу слишком углубляться в генерацию объектов, так как это не главный вопрос, но генерация карты с использованием raycasts чрезвычайно медленна, как вы теперь знаете, вам следует изучить генерацию шума для создания биомов и быстрого создания вашего экземпляра, Кроме того, картам действительно нужно определенное место для объектов, которые вы просто добавляете в данные, которые необходимо загрузить пользователю. Другой вариант — размещать объекты, которые служат визуальными объектами, произвольно на расстоянии просмотра, чтобы они существовали только в памяти, если кто-то пробежит мимо. обычная куча травы, им все равно, если она будет перемещена в следующий раз, когда они пробегут мимо нее.

person i773    schedule 29.05.2021
comment
Разве сервер не должен загружать все коллайдеры одновременно? Например, когда игрок стреляет на одном конце карты (при условии, что стрельба разрешена сервером), а другой стреляет на другом конце карты, сервер должен проверить, не попал ли один из них в камень или дерево? - person Aaron Michael Frost; 30.05.2021