Hero background image
Настройка проекта Unity для повышения производительности

Это первая статья из серии, в которой мы расскажем о советах по оптимизации для ваших проектов Unity. Используйте их как руководство для работы с более высокой частотой кадров при меньших ресурсах. Попробовав эти лучшие практики, обязательно ознакомьтесь с другими страницами этой серии:

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

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

О лучших методах работы с художественными активами читайте в этом руководстве. Чтобы получить руководство по работе с мобильными устройствами, ознакомьтесь с курсом Unity Learn по оптимизации 3D-арта для мобильных приложений.

Настройки качества
В НАСТРОЙКАХ QUALITY («КАЧЕСТВО») ВЫКЛЮЧИТЕ НЕНУЖНЫЕ ВАРИАНТЫ QUALITY LEVEL («УРОВЕНЬ КАЧЕСТВА»).
Отключите ненужные настройки проигрывателя или качества

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

Узнайте больше о графическом API.

Переход про IL2CPP.

Переключение бэкенда сценариев с Mono на IL2CPP (Intermediate Language to C++) может обеспечить более высокую производительность во время выполнения. Однако это также может увеличить время сборки. Некоторые разработчики предпочитают использовать Mono локально для ускорения итераций, а затем переходят на IL2CPP для машин сборки и/или релиз-кандидатов. Обратитесь к документации по оптимизации времени сборки IL2CPP, чтобы узнать больше о сокращении времени сборки.

Примечание: При использовании этой опции Unity преобразует ILcode из скриптов и сборок в C++ перед созданием нативного бинарного файла (.exe, .apk, .xap) для вашей целевой платформы.

О том, как различные опции компилятора влияют на производительность во время выполнения, читайте в разделе " Введение во внутреннее устройство IL2CPP " или на странице руководства "Опции компилятора ".

Выберите правильную частоту кадров

Мобильные проекты должны балансировать между частотой кадров и временем автономной работы и тепловым дросселированием. Подумайте о кадрах в секунду (fps).

Вместо того, чтобы разгонять свое устройство до 60 кадров в секунду, подумайте о компромиссе в виде 30 кадров в секунду. Обратите внимание, что в Unity уже установлено значение 30 кадров в секунду для мобильных устройств.

Вы также можете динамически настраивать частоту кадров во время выполнения программы с помощью Application.targetFrameRate. Например, для медленных или относительно статичных сцен (например, меню) можно опустить частоту ниже 30 кадров в секунду, а для игрового процесса оставить более высокие настройки.

Мобильные платформы не отображают полукадры. Даже если вы отключите Vsync в редакторе(Настройки проекта > Качество), он все равно будет включен на аппаратном уровне. Если графический процессор не может обновляться достаточно быстро, текущий кадр будет удерживаться, что приведет к снижению частоты кадров.

Более подробную информацию можно найти в документации.

Как настроить частоту акселерометра
ОТКЛЮЧИТЕ ЧАСТОТУ АКСЕЛЕРОМЕТРА, ЕСЛИ ВЫ НЕ ИСПОЛЬЗУЕТЕ ЕГО В СВОЕЙ МОБИЛЬНОЙ ИГРЕ.
Уменьшение или отключение частоты акселерометра

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

Узнайте больше об акселерометре.

Избегайте больших иерархий

Разделите иерархии. Если вашим игровым объектам не нужно быть вложенными в иерархию, упростите родительское управление.

Маленькие иерархии выигрывают от многопоточности при обновлении трансформаций в сцене. Сложные иерархии приводят к ненужным вычислениям преобразований и затратам на сборку мусора (GC).

Советы по преобразованиям см. в разделе Оптимизация иерархии и в этом выступлении Unite.

Несжатым текстурам требуется больше памяти, чем сжатым в DXT1
НЕСЖАТЫМ ТЕКСТУРАМ ТРЕБУЕТСЯ БОЛЬШЕ ПАМЯТИ, ЧЕМ СЖАТЫМ.
Сжимайте текстуры

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

При правильном применении сжатие текстур дает значительные преимущества в производительности, такие как более быстрая загрузка, меньший объем памяти и значительное увеличение производительности рендеринга. Сжатые текстуры используют лишь малую часть пропускной способности памяти, необходимой для несжатых 32-битных RGBA-текстур.

Обратитесь к этому рекомендуемому списку форматов сжатия текстур для целевых платформ.

Использование настроек импорта текстур

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

  • Уменьшите максимальный размер: используйте минимальные настройки, которые позволяют получить визуально приемлемые результаты. Это неразрушающий процесс, который может быстро уменьшить память текстур.
  • Используйте коэффициент двойки (POT):Unity требует размеры текстур POT для форматов сжатия текстур.
  • Отключите опцию Read/Write Enabled: если эта опция включена, она создает копию в адресуемой памяти CPU и GPU, что удваивает объем памяти текстуры. Отключите его в большинстве случаев и включайте только в том случае, если во время выполнения создается текстура, которую нужно перезаписать. Вы также можете применить эту опцию через Texture2D.Apply, передав в makeNoLongerReadable значение True.
  • Отключите ненужные Mip Maps: Mip Maps не нужны для текстур, которые остаются неизменного размера на экране, таких как 2D спрайты и UI Graphics. Однако оставьте Mip Maps включенной для 3D-моделей, которые находятся на разном расстоянии от камеры.

Подробнее о настройках импорта текстур.

Интерфейс Texture Atlas
ИСПОЛЬЗУЙТЕ TEXTURE ATLASES, ЧТОБЫ УМЕНЬШИТЬ ЧИСЛО ВЫЗОВОВ ОТРИСОВКИ.
Атласные текстуры

Атласирование - это процесс объединения нескольких мелких текстур в одну большую. Атласы текстур уменьшают потребление памяти и требуют меньшего количества вызовов отрисовки, тем самым снижая нагрузку на GPU.

  • Для 2D-проектов: Используйте Атлас спрайтов(Asset > Create > 2D > Sprite Atlas) вместо рендеринга отдельных спрайтов или текстур.
  • Для 3D-проектов: Вы можете использовать выбранный вами пакет Digital Content Creation (DCC). Несколько сторонних инструментов, таких как MA_TextureAtlasser или TexturePacker также можно использовать для создания атласов текстур.

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

Texture Packer объединяет отдельные карты в одну большую текстуру. После этого Unity может выполнить один вызов draw для доступа к упакованным текстурам с меньшими затратами на производительность.

Подробнее о Sprite Atlases читайте здесь.

Удаление граней модели
УДАЛЕНИЕ НЕВИДИМЫХ ГРАНЕЙ ДЛЯ ОПТИМИЗАЦИИ МОДЕЛЕЙ.
Проверьте количество полигонов

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

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

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

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

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

Управление настройками импорта сетки

Как и текстуры, сетки могут занимать много памяти, если их не импортировать аккуратно. Попробуйте воспользоваться этими советами, чтобы свести к минимуму потребление памяти сетками:

  • Сетчатая компрессия: Сжатие сетки позволяет сократить дисковое пространство (хотя память во время выполнения не затрагивается). В то же время квантование сетки может привести к неточности, поэтому экспериментируйте с уровнями сжатия, чтобы понять, что подходит для ваших моделей.
  • Отключить чтение/запись: включение этой опции дублирует сетку в памяти, в результате чего одна копия сетки остается в системной памяти, а другая - в памяти GPU. В большинстве случаев его следует отключить. В Unity 2019.2 и более ранних версиях эта опция отмечена по умолчанию.
  • Отключите ригиды и наложение фигур: Если вашей сетке не нужна скелетная анимация или анимация формы смешивания, отключите эти опции.
  • Отключите нормали и касательные: Если вы абсолютно уверены, что материал сетки не будет нуждаться в нормалях или касательных, снимите флажки с этих опций для дополнительной экономии.
Узнайте больше об оптимизациях сетки

Дополнительные опции оптимизации сетки доступны в Настройках игрока:

  • Vertex Compression устанавливает сжатие вершин для каждого канала. Например, вы можете включить сжатие для всего, кроме позиций и UV-изображений лайтмапа. Это позволяет сократить потребление памяти во время работы с сетками.
  • Примечание: Настройка сжатия сетки в настройках импорта каждой сетки переопределяет настройку сжатия вершин. В этом случае копия сетки во время выполнения не сжимается и может занимать больше памяти.
  • Optimize Mesh Data (Оптимизировать данные сетки ) удаляет из сетки все данные, которые не требуются применяемому к ней материалу (например, касательные, нормали, цвета и UV).
Проведите аудит своих активов

Автоматизация процесса аудита позволяет избежать случайного изменения настроек активов. Сайт AssetPostProcessor поможет вам стандартизировать настройки импорта или проанализировать существующие активы. Он позволяет запускать скрипты при импорте активов и, по сути, предлагает вам настроить параметры до и/или после импорта моделей, текстур, аудио и прочего.

Подробнее об аудите активов читайте в руководстве "Понимание оптимизации".

Настройка асинхронного текстурного буфера

Unity использует кольцевой буфер для передачи текстур на GPU. Вы можете вручную настроить этот буфер асинхронной текстуры с помощью QualitySettings.asyncUploadBufferSize.

Если скорость загрузки слишком низкая или главный поток замирает при загрузке нескольких текстур одновременно, настройте эти текстурные буферы. Обычно вы можете установить значение (в МБ), равное размеру самой большой текстуры, которую нужно загрузить в сцену.

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

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

Параметры потоковой передачи текстур
НАСТРОЙКИ ПОТОКОВОЙ ПЕРЕДАЧИ ТЕКСТУР
Карты и текстуры Stream Mip

Сайт Потоковая передача Mip Map Система дает вам контроль над тем, какие уровни Mip Map должны загружаться в память. Включите его, зайдя в настройки качества Unity(Edit > Project Settings > Quality) и отметив опцию Texture Streaming. Вы можете включить потоковую передачу Mip-карт в настройках импорта текстур в разделе " Дополнительно".

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

Потоковая передача текстур обменивает небольшое количество ресурсов CPU на потенциально большой объем памяти GPU. Он также автоматически снижает уровни Mip Map, чтобы не выходить за рамки заданного пользователем бюджета памяти.

Для дополнительного контроля можно использовать Mip Map Streaming API.

Адресная инвентаризация
В ЭТОМ ПРИМЕРЕ АДРЕСНЫЕ ОБЪЕКТЫ ОТСЛЕЖИВАЮТ ЗАПАСЫ СБОРНЫХ КОНСТРУКЦИЙ.
Использование адресных устройств

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

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

Установите пакет Addressables из менеджера пакетов. В результате каждый актив или префаб в проекте может стать "адресуемым".

Установите флажок под именем актива в Инспекторе, чтобы присвоить ему уникальный адрес по умолчанию. После маркировки соответствующие активы появляются в окне Window > Asset Management > Addressables > Groups .

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

См. Addressables: Введение в концепцию для краткого обзора того, как система Addressable Asset System может работать в вашем проекте.

ключ единства арт 21 11
Получите бесплатную электронную книгу

Одно из самых полных наших руководств, в котором собрано более 80 действенных советов по оптимизации игр для ПК и консолей. Эти подробные советы, созданные нашими экспертами в области Success и Accelerate Solutions, помогут вам получить максимальную отдачу от Unity и повысить производительность вашей игры.

Понравился ли вам этот контент?