🎮⚙️ Неправильные настройки импорта в Unity убивают вашу игру
Неправильно настроенные текстуры и звуки могут незаметно убить производительность вашей игры в Unity. В этой статье мы разберем, как избежать распространенных ошибок при импорте и максимально эффективно использовать ресурсы системы.
Есть много вещей, которые могут пойти не так при разработке вашей игры. Модели могут иметь больше треугольников, чем может обработать целевая платформа, у них может быть слишком много материалов, поэтому батчинг не будет работать эффективно, а алгоритмы могут быть слишком затратными для процессора. Это сложные проблемы, и вы, как разработчик игр, всегда должны помнить о необходимости соблюдать баланс между визуальной составляющей и производительностью. Тем не менее, есть некоторые вещи настолько простые, что мы часто забываем об их существовании, но они могут серьезно повлиять на производительность вашей игры.
Настройки импорта текстур
Когда вы добавляете текстуру в свой проект, Unity творит с ней чудеса — текстура преобразуется в подходящий формат на основе текущих настроек импорта. В большинстве случаев настройки по умолчанию будут достаточно хороши, но Unity не может определить, выглядит ли что-то достаточно хорошо для игрока, поэтому не может изменить специфические параметры без вашего ведома. Здесь вступаете вы.
Чтобы получить доступ к настройкам импорта текстур, просто выберите одну или несколько текстур, которые вы хотите изменить. Ваш инспектор будет выглядеть примерно так:
Здесь есть три основных параметра, на которые стоит обратить внимание.
Тип текстуры (Texture Type)
Texture Type — это способ сообщить Unity, для чего будет использоваться эта текстура. Каждый из вариантов настроит внутренние параметры текстуры так, чтобы они были оптимальными для выбранной цели. Обратите внимание, что текстура типа Default — это простая диффузная текстура, используемая в трехмерном пространстве, и для трехмерных игр ее следует использовать чаще всего. Описания типов можно найти в официальном руководстве Unity.
Риск изменения параметра: установка неправильного типа текстуры может быть незаметна на первый взгляд, но в действительности вы получите потерю производительности. Некоторые типы требуются для корректной работы шейдеров (например, для текстуры, которая будет использоваться для отображения рельефа, необходимо установить тип Normal map).
Размер (Size)
Здесь надо указать, насколько большой должна быть ваша текстура и как она должна храниться в памяти устройства. Вы заметили, что вместо размера параметра Size используется Max Size? Это просто потому, что вы можете уменьшить все разрешения текстур для своей игры в настройках качества (вкладка Quality Settings в разделе Project Settings).
Также установка значения 2048 в качестве максимального размера не гарантирует, что эта текстура будет такого размера, даже если настройки качества установлены на самое высокое значение. Разрешение текстуры окажется ниже, если исходный файл текстуры недостаточно большой. Хорошей практикой является подготовка текстур большего размера, чем вам нужно, потому что вы всегда можете уменьшить их масштаб в настройках импорта.
Риск изменения параметра: некоторые модели могут быть маленькими на экране, а текстуры этих моделей могут иметь слишком большое разрешение. Вы можете обнаружить эти объекты, установив режим отображения сцены на Mipmaps:
Формат (Format)
Формат текстуры — еще одна вещь, которая может сбивать с толку.
Если ваш тип текстуры установлен Default, у вас будет возможность выбрать один из 12 вариантов формата.
Все варианты отличаются между собой уровнем сжатия, качеством изображения, размером файла и поддержкой различными платформами.
Например, RGBA 32 bit сохраняет текстуру без сжатия, используя 32-битную палитру. При этом текстура будет занимать больше места на диске.
RGBA 16 bit сохраняет текстуру, используя 16-битную цветовую палитру. Подходит для текстур с небольшим количеством цветов.
Если выбрать автоматический выбор формата, Unity сам установит текстуре нужный формат. Подробнее про различные форматы можно прочитать в документации Unity.
Как видите, вы жертвуете размером текстуры ради ее качества. Мой совет — всегда устанавливайте формат как сжатый, пока вы не увидите, что с текстурами в вашей игре что-то не так.
Имейте в виду, что не все форматы сжатия могут поддерживаться вашей целевой платформой (например, многие устройства Android поддерживают разные форматы сжатия текстур, но все должны поддерживать ETC).
Риск изменения параметра: сжатые текстуры могут выглядеть некрасиво для некоторых типов текстур, а несжатые могут занимать слишком много места. Вы можете найти текстуры, которые занимают слишком много места, просмотрев editor.log после сборки вашей игры.
Проверка
Последнее, что вам нужно сделать, это проверить информацию об импорте текстуры. Здесь, в нижней части окна предварительного просмотра текстуры, вы можете посмотреть:
- Используемый размер текстуры
- Используемый формат сжатия
- Размер результирующей текстуры
Помните, что иногда вам нужно будет собрать игру, прежде чем вы увидите ее итоговый размер.
Настройки импорта аудиоклипов
При работе с Unity многие вещи могут сохранять свои настройки по умолчанию, и все будет работать просто отлично. Конечно, в большинстве случаев настройки по умолчанию не являются оптимальными, но даже с ними ваша игра должна работать нормально. К сожалению, это правило не распространяется на настройки импорта аудиоклипов.
Импорт аудиоклипов (звуковых файлов) работает очень похоже на импорт текстур. Unity поддерживает множество различных аудиоформатов, но в конечном итоге преобразует их все в предпочтительный (движком) формат. В настоящее время в Unity это могут быть PCM, ADPCM и Vorbis/MP3. Обратите внимание, что не каждая платформа может обрабатывать все эти форматы сжатия, а на некоторых платформах доступен только один формат (например, WebGL может работать только с аудиоклипами AAC).
Память имеет значение
Все аудиоклипы импортируются по умолчанию с типом загрузки «Decompress On Load» и форматом сжатия «Vorbis».
Вы должны быть очень осторожны с этой настройкой, потому что использование ее для всех ваших аудиоклипов (Unity делает это по умолчанию!) может потреблять большой объем памяти вашей игры! Вы видите информационное поле на скриншоте? Исходный размер файла вычисляется как 9.8 МБ, а импортированный размер — как 6.5 МБ. Это означает, что этот аудиоклип увеличит размер вашей игры (архива) на 6.5 мегабайт, но для его воспроизведения потребуется почти 9.8 мегабайт оперативной памяти! Это звучит не так уж и страшно, если вы создаете игру для ПК, где довольно часто бывает 16 гигабайт оперативной памяти, но мобильные устройства все еще достаточно ограничены в этом отношении.
Когда следует использовать определенный тип загрузки?
Давайте разберемся. Можно использовать любую комбинацию типа загрузки и формата сжатия, и вы лучше всех знаете, какой из них следует выбрать. Существует три типа загрузки:
- Compressed In Memory (Сжатый в памяти) — аудиоклип будет сохранен в ОЗУ и распакован при воспроизведении. Не требует дополнительной памяти для воспроизведения.
- Streaming (Потоковая передача) — аудиоклип будет сохранен в постоянной памяти устройства (жесткий диск, флэш-накопитель и т. д.) и будет транслироваться оттуда при воспроизведении. Не требует ОЗУ для хранения и воспроизведения (по крайней мере, это значение не имеет значения).
- Decompress On Load (Распаковка при загрузке) — аудиоклип будет сохранен в ОЗУ в несжатом виде. Этот вариант требует больше всего памяти, но его воспроизведение не потребует такой большой мощности ЦП, как остальные.
Выбор типа загрузки аудиоклипа зависит от его размера и назначения.
Музыка или окружающие звуки
Музыка хранится в длинных аудиоклипах, поэтому она может занимать много памяти. Конечно, мы не хотим, чтобы музыка распаковывалась в память, а затем воспроизводилась. Здесь у вас есть два варианта:
- Использовать тип загрузки «Streaming» и формат сжатия «Vorbis». Эта комбинация будет использовать наименьший объем памяти, но потребует некоторой мощности ЦП и пропускной способности ввода-вывода диска.
- Использовать тип загрузки «Compressed In Memory» и формат сжатия «Vorbis». Единственное отличие от первого решения заключается в том, что оно заменит дисковый ввод-вывод на некоторые требования к памяти. Обратите внимание, что вы можете отрегулировать ползунок качества, чтобы уменьшить размер сжатого клипа в обмен на качество звука. Обычно 100 процентов — это слишком много. Я бы рекомендовал что-то около 70 процентов.
Обратите внимание, что если у вас воспроизводится более 2 музыкальных/окружающих звуков, это может потреблять серьезное количество мощности ЦП.
Звуковые эффекты
Звуковые эффекты обычно представляют собой короткие или средние аудиоклипы. Также они могут воспроизводиться часто или редко. Вот несколько правил:
- Для часто воспроизводимых и коротких аудиоклипов используйте Decompress On Load и формат сжатия PCM или ADPCM. При выборе PCM декомпрессия не требуется, и если аудиоклип короткий, он загрузится очень быстро. Вы также можете использовать ADPCM. Он требует декомпрессии, но его гораздо легче распаковывать, чем Vorbis.
- Для часто воспроизводимых, но средних аудиоклипов используйте Compressed In Memory и формат сжатия ADPCM. ADPCM примерно в 3.5 раза меньше, чем raw PCM, и алгоритм декомпрессии не будет потреблять столько ресурсов ЦП, как Vorbis.
- Для редко воспроизводимых и коротких аудиоклипов используйте Compressed In Memory и ADPCM. По той же причине, что описана в пункте 2.
- Для редко воспроизводимых и средних аудиоклипов используйте Compressed In Memory и формат сжатия Vorbis. Такие аудиоклипы могут быть слишком длинными для хранения с использованием ADPCM и воспроизводиться слишком редко, поэтому дополнительная мощность ЦП, необходимая для декомпрессии, не будет такой уж проблемой.
Заключение
Всегда помните о необходимости проверять настройки импорта аудиоклипов. Это тихие убийцы производительности вашей игры. Настройте их правильно, и вы получите дополнительную мощность ЦП для важных вещей.
Также ознакомьтесь с руководством игрового движка для получения технической информации о настройках импорта текстур, звуковых файлов и других ассетов.
Какие еще аспекты оптимизации в Unity, помимо настроек импорта, вы считаете критически важными для успешной разработки игр?