В проекте Unity используются следующие решения:

Упрощение 3D-моделей

При создании 3D-моделей следует использовать минимальное количество полигонов для описания нужной формы. Однако, если созданная сцена получилась слишком «тяжёлой», можно использовать LOD (Level of Detail) – приём, заключающийся в создании нескольких вариантов одного объекта с различными степенями детализации, которые переключаются в зависимости от удаления объекта от виртуальной камеры.
Использование LOD способно существенно снизить требования к ресурсам компьютера при выводе графики на экран.

Подробнее о том, как оптимизировать 3D-модели и использовать LOD в Unity можно узнать в видео MAKE YOUR GAME RUN SMOOTH — Unity LOD Tutorial, а также в разделе Level of Detail (LOD) for meshes.

В нашем случае для рендеринга сцены необходимо было обработать около 150 тыс. треугольников.
Мы не использовали LOD, так как зона передвижения пользователя была небольшой.

Уменьшение разрешения текстур

Следующем шагом было уменьшение разрешения текстурных карт с 8192×8192 до 2048х2048 px для 3D-моделей, с которыми пользователь взаимодействует регулярно, и с 8192х8192 до 512×512 px для 3D-моделей, находящихся за пределами зоны передвижения пользователя.

Для этого использовалась встроенная функция сжатия текстур в Unity. Более подробно о форматах текстур для целевых платформ можно узнать в разделе Recommended, default, and supported texture formats, by platform.

Уменьшение вызовов отрисовки

Пакетная обработка вызовов отрисовки (Draw call batching) – это метод оптимизации, который объединяет сетки, чтобы Unity мог отображать их за меньшее количество вызовов отрисовки.

О том, как оптимизировать вызовы отрисовки можно узнать в разделе Optimizing draw calls.

В нашем случае использовалось два метода оптимизации:

  1. Static batching – это метод, который объединяет неподвижные сетки для уменьшения количества вызовов отрисовки. Он преобразует объединённые сетки в мировое пространство и строит для них один общий вершинный и индексный буфер. Затем для видимых мешей Unity выполняет ряд простых вызовов отрисовки, практически без изменения состояния между каждым из них.
  2. Scriptable Render Pipeline Batcher (SRP Batcher) – это метод, который значительно повышает производительность приложений, использующих SRP. SRP Batcher сокращает время, необходимое Unity для подготовки и отправки вызовов отрисовки для материалов, использующих один и тот же шейдер. Информация о SRP Batcher в Unity URP представлена в разделе Universal Render Pipeline → Rendering.

Отбор окклюзии

Отбор окклюзии (Occlusion culling) – это процесс, который не позволяет Unity выполнять расчёты рендеринга для игровых объектов (Game objects), которые полностью скрыты от просмотра (или закрыты) другими игровыми объектами.

Более подробно о процессе отбора окклюзии и его использовании можно узнать в разделе Occlusion culling.

Уменьшение разрешения теней

Так как всё освещение в сцене просчитывалось в реальном времени, а этот процесс являлся наиболее ресурсоёмким, последним шагом было уменьшение качества теней. Для этого были созданы каскады теней (Shadow cascades), которые позволяют установить разрешение теней относительно виртуальной камеры.

Более подробно о каскадах теней можно узнать в разделе Shadow Cascades. Информация о настройке каскадов в Unity URP представлена в разделе Universal Render Pipeline → Shadow.