Game teardown

Визуализация в масштабе: Эффективные стратегии для обработки больших объемов объектов.

MATTHEW WOJTECHKO / MEGA CAT STUDIOSLead Game Developer
Aug 14, 2026
Сцена из соседнего района в игре Backyard Baseball 2026 от Mega Cat Studios и Playground Productions.
Эта веб-страница была переведена с помощью машинного перевода для вашего удобства. Мы не можем гарантировать точность или надежность переведенного контента. Если у вас есть вопросы о точности переведенного контента, обращайтесь к официальной английской версии веб-страницы.

Это четвёртая статья в серии, написанной студией Mega Cat Studios. В этой статье Мэтью Войтечко рассматривает уроки повышения производительности, извлеченные из использования URP и HDRP, и исследует передовые решения, такие как пользовательские реализации групп пакетной обработки для рендеринга травы, где каждая миллисекунда на счету.

Прочитайте другие записи в этой серии:

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

А если вы ориентируетесь на менее мощные платформы, такие как мобильные или автономные устройства, то проблема заключается не только в них. В любой среде, содержащей хоть какой-то уровень детализации, оборудование может начать работать с перебоями.

В Mega Cat Studios мы уже много лет расширяем возможности системы рендеринга Unity, и нам пришлось применить все имеющиеся в нашем распоряжении приемы, чтобы создать очаровательный художественный стиль игры Backyard Baseball для ПК и консолей, не жертвуя при этом художественным замыслом.

В этой статье мы рассмотрим такие методы, как статическая пакетная обработка и текстуры с вершинной анимацией, а также поделимся некоторыми проблемами, с которыми мы столкнулись в нашем самом масштабном на сегодняшний день 3D проекте, — всё это с целью помочь вам поддерживать плавную частоту кадров при резком увеличении количества объектов.

Даже обманчиво простая на вид среда может представлять собой сложную задачу для рендеринга на слабом оборудовании.
Даже обманчиво простая на вид среда может представлять собой сложную задачу для рендеринга на слабом оборудовании.

Выясните, что вызывает проблемы с отрисовкой, а затем выполните оптимизацию.

Рендеринг — это взаимодействие между центральным и графическим процессорами.

«Центральный процессор — это тренер, а графический процессор — это спортсмен». «Центральный процессор задает команду, а графический процессор ее выполняет», — говорит Лиам Дудас, инженер по оптимизации игры Backyard Baseball.

Иногда работа, которую должен выполнить графический процессор, занимает больше времени, чем другие задачи. Сложные сетки, шейдеры и освещение могут вызывать замедление работы, и лучший способ повысить производительность — это упростить их, попросив художника оптимизировать эти ресурсы.

В других случаях важно не то, что центральный процессор просит сделать графический процессор, а то, как он это делает .

Выполняет ли центральный процессор свои инструкции оптимально? Процессору требуется много времени, чтобы понять, что нужно нарисовать, из-за чего он бездействует, вместо того чтобы запустить остальную часть игры? Предоставляет ли центральный процессор избыточную информацию? Хороший тренер может вдохновить свою команду на неожиданный камбэк, но когда дело доходит до оптимизации, мы не можем просто заставить эти системы «стараться лучше». Все дело в понимании информации, с которой они имеют дело, и в том, как они ее передают.

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

Существует множество способов добиться этого, но прежде чем вы начнете, следует быть осторожным.

Не стоит просто так, бездумно оптимизировать код, лишь ради удовольствия от его умного исполнения. Всегда сначала проводите сравнительный анализ. Выясните, в чём ваш проект испытывает наибольшие трудности. Первый вопрос, который вы всегда должны задать: Узкое место у вас в процессоре или видеокарте?

Некоторые из решений, описанных в этом посте, увеличивают скорость работы процессора, другие — скорость работы видеокарты. Не стоит слишком увлекаться оптимизацией одного процессора, если источником скачков частоты кадров является другой. Определив, является ли ваша игра ресурсоемкой для процессора или видеокарты, выясните, какая процедура занимает больше всего времени, и оптимизируйте именно ее. Руководство Unity по лучшим практикам профилирования — отличное место для начала, оно включает в себя удобную блок-схему, которая дает представление о зачастую загадочном процессе профилирования.

«Мне приходится проводить большую работу по составлению профилей», — говорит Лиам. «Я могу определить, когда центральный процессор работает интенсивно, а графический процессор — нет, и наоборот». На самом деле, самым проблемным местом для нас были именно эти два фактора в разное время.

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

И, сделав это предупреждение, давайте рассмотрим варианты оптимизации.

Упрощение и отбор

При рендеринге нам необходимо определить, какие сетки следует отображать и где.

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

Мы могли бы ускорить этот процесс, отрисовывая меньшее количество мешей. Например, вы можете заменить сложные модели на поддельные, рекламные щиты или низкополигональные версии; или вы можете разбить обширный мир на более мелкие уровни, которые нужно будет отрисовывать одновременно в меньшем количестве. Это проверенные решения, которые следует использовать по возможности, но они ограничивают уровень детализации ваших окружений.

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

Статическая пакетная обработка

Ещё один способ ограничить количество отображаемых мешей без ущерба для разнообразия — объединить их в один.

Вы можете сделать это самостоятельно вручную. Или же, если сетки используют один и тот же материал, Unity может сделать это за вас в процессе, называемом пакетной обработкой. Если установить для игрового объекта статический статус, Unity автоматически объединит все сетки с одинаковым материалом в одну группу, чтобы сократить количество вызовов отрисовки. Используйте эту опцию для любых статичных объектов, таких как деревья и стены.

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

Статическая пакетная обработка часто является для нас ключевым процессом оптимизации, особенно для игры Backyard Baseball . Использовать систему дозирования URP просто, поэтому самая сложная задача — понять, как использовать как можно меньше материалов в как можно большем количестве моделей. Именно благодаря такому балансу в наших командах по оптимизации и разработке дизайна работают одни из самых креативных специалистов.

инстансирование GPU

Сейчас самое время начать различать вещь… и конкретный пример этой вещи.

Допустим, у вас есть сетка. Сетка — это преимущество. И его материальные ресурсы являются преимуществом. Это отдельные файлы, которые существуют в вашей файловой структуре. Для каждого объекта с 3D изображением в вашей игре сетка описывает его форму, а материал описывает внешний вид его поверхности.

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

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

Растительность часто является хорошим кандидатом для использования в режиме инстансинга на графическом процессоре.
Растительность часто является хорошим кандидатом для использования в режиме инстансинга на графическом процессоре.

Включение параметра «Включить экземпляр» для материала указывает Unity объединять в один вызов отрисовки различные экземпляры материала, использующие один и тот же материал. Это отличный способ сбалансировать разнообразие и производительность ваших моделей. И, в отличие от статической пакетной обработки, инстансирование на графическом процессоре можно использовать для игровых объектов, которые движутся в вашей сцене, поэтому вы не ограничены оптимизацией только таких вещей, как стены и деревья, но и таких объектов, как обломки после крушения или канцелярские принадлежности.

Текстуры вершинной анимации

Статическая пакетная обработка и создание экземпляров на графическом процессоре — это два разных способа оптимизации сеток и материалов. Иногда, однако, причиной «узкого места» являются именно анимации. Возьмём простой пример с лесом, о котором говорилось ранее. Теперь представьте, как его ветви и листья покачиваются на ветру, демонстрируя уникальную и естественную живость. Запуск 10 000 уникальных процессов анимации обычным способом просто не сработает. Если вы не будете осторожны, бедный процессор будет задыхаться!

Один из приемов — использование текстур вершинной анимации (VAT). VAT использует вычислительную мощность графического процессора, чтобы попробовать свои силы в анимации.

Для Давида Чавеса Арментероса, старшего разработчика Mega Cat Studios, использование VAT для имитации толпы было одним из любимых графических приемов, которые он оптимизировал.

«При использовании стандартных рендеров анимированных моделей с помощью Animator можно отрендерить лишь несколько десятков персонажей, после чего производительность начинает падать», — говорит он. «Но, объединив VAT с инстансированием на графическом процессоре, можно одновременно отображать на экране тысячи анимированных объектов».

При использовании VAT каждая вершина сетки считывает свою анимированную позицию из текстуры в каждом кадре. Для этого мы кодируем данные о положении и вращении в значения RGB . Затем специальный шейдер считывает все пиксели текстуры, чтобы определить, как переместить все вершины.

Именно это мы использовали для имитации колышущейся травы в игре Backyard Baseball . Это эффективный способ создания плавных анимаций, но помните, что это исключительно визуальный эффект — коллайдер при этом не меняется. Благодаря этому VAT идеально подходит для ситуаций, когда движение необходимо, но точное обнаружение столкновений не требуется.

В игре Backyard Baseball колышущейся травы достигается с помощью текстур вершинной анимации (VAT).
В игре Backyard Baseball колышущейся травы достигается с помощью текстур вершинной анимации (VAT).

И любая оптимизация предполагает компромисс. НДС освобождает ресурсы процессора, но при этом создает дополнительную нагрузку на оперативную память. Всё это необходимо сбалансировать с другими решениями для рендеринга в игре.

«Самой сложной задачей в этой системе было балансирование использования памяти и вычислений отсечения на основе графического процессора, чтобы справиться с ограниченными ресурсами автономных устройств», — говорит Джордан Латта, технический художник Backyard Baseball .

URP против HDRP

Первое, что вы решаете при оптимизации графики, — это выбор конвейера рендеринга на начальном этапе проекта. Универсальный конвейер рендеринга (URP) обладает хорошими базовыми характеристиками и является абсолютно необходимым для мобильных и автономных устройств. Конвейер рендеринга высокой четкости (HDRP) ориентирован на высококачественную визуализацию и предлагает более специализированное поведение при создании экземпляров объектов.

В целом, мы рекомендуем использовать URP вместо HDRP в Unity. Возможно, у вас есть сценарий использования, требующий HDRP, но мы руководствуемся простым принципом: Старайтесь максимально эффективно использовать функцию рендеринга.

HDRP предоставляет некоторые возможности высокого уровня, но если вы точно знаете, что вам не нужна реалистичная картинка, мы рекомендуем отказаться от его использования.

Дополнительные приемы оптимизации

Иногда проблема с отображением тысяч объектов на экране заключается вовсе не в рендеринге. Это ваш собственный код. В таких случаях вы можете использовать следующие приемы:

  • Объедините тысячи циклов обновления в один. Вместо того чтобы присваивать каждому GameObject собственный MonoBehaviour, объедините их в один, чтобы они использовали одну и ту же функцию Update. Централизованный менеджер помогает избежать тысяч отдельных циклов обновления.
  • Вместо того чтобы запускать все процессы в одном потоке, используйте многопоточность. Изучите возможность использования системы заданий и компилятора Burst в качестве подходящих вариантов для вашей игры.
  • Зарабатывайте на тайниках. Вместо того чтобы получать доступ к основной камере или к преобразованию объекта GameObject каждый кадр, кэшируйте их один раз, а затем повторно используйте эту ссылку. Тародев демонстрирует повышение производительности и объясняет другие оптимизации.

Пожалуй, наибольший прирост производительности рендеринга для вашего следующего проекта обеспечит использование последней LTS-версии Unity. В Unity 6.3 LTS представлен целый ряд улучшений, включая оптимизации для повышения производительности.

В случае с Backyard Baseball самым простым и эффективным способом оптимизации стало ограничение использования текстур.

Существует несколько хитрых способов, с помощью которых можно случайно использовать вдвое больше текстур, чем нужно:

  • Шейдеры : Если шейдер использует текстуру дважды, не используя одну и ту же ссылку, он может загрузить текстуру в несколько мест в памяти.
  • Скрипты : Аналогичным образом, разные участки вашего кода могут загружать одну и ту же текстуру через разные ссылки.
  • Version Control : Когда два разработчика добавляют один и тот же файл в свою локальную ветку, иногда оба файла сохраняются при слиянии веток, занимая избыточное место в памяти.

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

В студии Mega Cat Studios эти стратегии позволяют нам создавать сцены, которые еще несколько лет назад были немыслимы.

Для нас рендеринг — это, по сути, магия: мы можем создавать всё, что можем себе представить, в режиме реального времени, но только после тщательного изучения секретных текстов (документации Unity , статей в блогах, видеоуроков на YouTube). К счастью, у нас в штате есть настоящие волшебники, которые обожают погружаться в эту документацию и делиться результатами с командой.

И, конечно же, наибольшую выгоду получают наши игроки. Мы надеемся, что поклонники получат удовольствие от знакомства с Backyard Baseball, даже не задумываясь о том, сколько крови, пота и волшебства было вложено в создание этого мира, чтобы он казался таким реальным.

Подробнее