Что вы получите с этой страницы: Советы по оптимизации художественных активов для разработчиков мобильных игр, работающих в Unity. Это первая из двух статей об оптимизации искусства для мобильных игр.
Многие другие советы по оптимизации мобильных устройств вы найдете в этой всеобъемлющей электронной книге и в этом курсе Unity Learn по Оптимизация 3D-арта для мобильных приложений.
Как полигоны, так и вершины требуют больших вычислительных затрат на мобильных платформах. Размещайте полигоны в областях, которые действительно способствуют визуальному качеству приложения, чтобы не тратить бюджет на обработку.
Из-за небольшого размера экрана большинства мобильных устройств и расположения 3D-объектов в вашем приложении многие мелкие треугольные детали на 3D-объекте могут быть не видны. Это означает, что вы должны сосредоточиться на крупных формах и деталях, которые создают силуэт объекта, а не на мелких деталях, которые могут быть не видны. Используйте текстуры и карты нормалей для получения мелких деталей.
По мере удаления объектов уровень детализации (LOD) может регулироваться или переключаться на использование более простых сеток с более простыми материалами и шейдерами для повышения производительности GPU.
Другие советы по подготовке к LOD
- Удаляйте больше полигонов на более плоских участках и не используйте плотные области треугольников на объектах с низким LOD.
- LOD также может применяться к сложности шейдеров. Шейдер и материал могут быть оптимизированы для 3D-объектов, расположенных на большом расстоянии. Например, вы можете уменьшить количество текстур, используемых объектом, по мере того как он удаляется от камеры.
- Часто стоит уменьшить количество треугольников между каждым уровнем LOD на 50%.
- Проверьте, как выглядит LOD на разных расстояниях от камеры.
- Чистая топология необходима для деформирующихся или анимированных персонажей и объектов.
- Не зацикливайтесь на идеальной топологии. После применения текстуры и материала игрок или конечный пользователь не увидит каркаса 3D-модели.
Когда не стоит использовать LOD
LOD подходит не для всех ситуаций. Например, не используйте его в приложениях, где вид камеры и объекты статичны, или где объект уже использует малое количество полигонов. LOD занимает много памяти и имеет больший размер файла, поскольку данные сетки должны быть сохранены, чтобы их можно было использовать в режиме реального времени.
Вы можете объединить несколько сеток в одну, чтобы сократить количество вызовов рисования, необходимых для рендеринга. Чтобы применить эту технику, создайте пустой объект GameObject в иерархии и сделайте его родителем сетки, которую вы хотите объединить, затем прикрепите скрипт, реализующий метод Mesh.CombineMeshes(), к родительскому объекту GameObject.
Использование окклюзии
Объекты, скрытые за другими объектами, потенциально могут продолжать рендериться и тратить ресурсы. Используйте функцию Occlusion Culling, чтобы избавиться от них.
В то время как обрезка фрагментов за пределами обзора камеры происходит автоматически, обрезка окклюзии - это запекаемый процесс. Просто пометьте объекты как Static Occluders или Static Occludees, а затем запеките их через диалог Window > Rendering > Occlusion Culling . Хотя это не обязательно для каждой сцены, во многих случаях выбраковка может повысить производительность. Подробнее об этом читайте в руководстве " Работа с окклюзией ".
Вот несколько полезных советов, которые следует учитывать при импорте моделей.
- Тип анимации: При импорте FBX-сетки, не содержащей данных анимации, установите для Animation Type значение None на вкладке Rig в настройках импорта. Когда вы помещаете сетку в иерархию, эта настройка гарантирует, что Unity не создаст неиспользуемый компонент Animator.
- Отключите ригиды и BlendShapes: Если ваша сетка не нуждается в скелетной или блендшейп-анимации, отключите эти опции, где это возможно.
- Отключите нормали и касательные: Если вы абсолютно уверены, что сетчатому материалу не понадобятся нормали или касательные, снимите флажки с этих опций для дополнительной экономии.
- Настройки импорта Если ваша модель не изменяется во время выполнения, отключите опцию Read/Write Enabled на вкладке Model в Import Settings, чтобы предотвратить создание копии в памяти.
- Статическое/динамическое дозирование: Статическое пакетирование - распространенная техника оптимизации, позволяющая сократить количество вызовов отрисовки. Он идеально подходит для объектов, состоящих из большого количества вершин, которые не перемещаются, не вращаются и не масштабируются во время рендеринга. Установите флажок Static в инспекторе, содержащем Mesh Renderer вашей целевой модели.
Текстуры могут быть разных размеров. Уменьшение размера текстур, требующих меньшей детализации, поможет снизить пропускную способность. Например, диффузная текстура может быть установлена на 1024 x 1024, а соответствующая карта шероховатости/металлическая карта - на 512 x 512. Делайте все возможное, чтобы выборочно уменьшить размер текстуры, и всегда проверяйте, не ухудшились ли после этого визуальные эффекты.
Большинство программ для текстурирования работают с текстурами и экспортируют их, используя цветовое пространство sRGB.
Мы рекомендуем использовать диффузные текстуры в цветовом пространстве sRGB. Текстуры, которые не обрабатываются как цвет, не должны быть в цветовом пространстве sRGB. Примерами таких текстур являются металлические, шероховатые и нормальные карты, поскольку карты используются в качестве данных, а не цвета. Использование sRGB в этих картах приведет к неправильному изображению материала.
Примечание: Убедитесь, что в настройках sRGB (цветная текстура) в окне Inspector нет галочек рядом с шероховатостью, спекуляром, картами нормалей и другими подобными элементами.
Такие элементы, как окклюзия окружения и небольшие спекулярные блики, могут быть запечены, а затем добавлены в диффузную текстуру. Такой подход означает, что вам не придется слишком полагаться на дорогостоящие вычислительные шейдеры и функции Unity для получения спекулярных бликов и окклюзии окружения.
По возможности используйте серые текстуры, которые позволяют подкрашивать цвета в шейдере. Это экономит память текстуры за счет создания собственного шейдера для выполнения тонирования. Будьте избирательны при использовании этой техники, потому что не все объекты хорошо смотрятся при использовании этого метода. Проще применить это к объекту, который имеет однородный цвет.
Фильтрация текстур часто улучшает качество текстур в сцене, но при этом может снижать производительность, поскольку для достижения лучшего качества текстур часто требуется больше обработки. На фильтрацию текстур иногда приходится до половины энергопотребления GPU. Выбор более простых и подходящих фильтров Texture может помочь снизить энергопотребление приложения.
- Ближайшая/точечная фильтрация: Это самая простая и наименее затратная по вычислительным ресурсам форма фильтрации текстур, хотя при близком рассмотрении такая фильтрация может придать текстурам блочный вид.
- Билинейная фильтрация: Билинейная фильтрация отбирает и усредняет соседние тексели, чтобы окрасить пиксели в текстуре. В отличие от ближайшей фильтрации, при билинейной фильтрации пиксели получаются менее размытыми, поскольку они имеют плавный градиент. Побочным эффектом билинейной фильтрации является то, что Текстуры будут выглядеть размытыми при близком рассмотрении.
Большая часть вашей памяти, скорее всего, уйдет на текстуры, поэтому настройки импорта здесь очень важны. В общем, старайтесь следовать этим рекомендациям при импорте активов.
- Уменьшите максимальный размер: Используйте минимальные настройки, обеспечивающие визуально приемлемые результаты. Это неразрушающий процесс, который может быстро уменьшить память текстур.
- Используйте коэффициент двойки (POT): Unity требует размеры текстуры POT для мобильных форматов сжатия текстур (PVRCT или ETC).
- Атласные текстуры: Размещение нескольких текстур в одной текстуре позволяет сократить количество вызовов рисования и ускорить рендеринг. Используйте Unity Sprite Atlas или сторонний TexturePackert дляатласа текстур.
- Отключите опцию Read/Write Enabled: При включении этой опции копия создается в памяти, адресуемой как CPU, так и GPU, что удваивает объем памяти, занимаемый текстурой. В большинстве случаев эта функция отключена. Если вы генерируете текстуры во время выполнения, обеспечьте это с помощью Texture2D. Примените, передав в makeNoLongerReadable значение true.
- Отключите ненужные mipmaps: Mipmaps не нужны для текстур, которые остаются неизменными по размеру на экране, например, для 2D спрайтов и графики пользовательского интерфейса. Оставьте mipmaps включенным для 3D-моделей с разным расстоянием от камеры.
- Используйте билинейную фильтрацию: Это поможет найти баланс между производительностью и визуальным качеством.
- Избирательно используйте трилинейную фильтрацию: Она требует большей пропускной способности памяти, чем билинейная фильтрация.
- Используйте билинейную и 2x анизотропную фильтрацию: Выберите их вместо трилинейных и 1x анизотропных, чтобы улучшить внешний вид и производительность.
- Сохраняйте низкий уровень анизотропии: Используйте уровень выше 2 только для критически важных игровых активов.
Используйте адаптивное масштабируемое сжатие текстур (ATSC) как для iOS, так и для Android. Подавляющее большинство разрабатываемых игр ориентировано на устройства с минимальными характеристиками, поддерживающие сжатие ATSC. Исключение составляют:
- Игры для iOS, ориентированные на устройства с экраном A7 или ниже (например, iPhone 5, 5S и т. д.): Используйте PVRTC
- Игры для Android, предназначенные для устройств, выпущенных до 2016 года: ИспользоватьЭрикссоновское сжатие текстур (ETC2)
Упаковка каналов текстур помогает экономить память текстур, поскольку в одной текстуре можно разместить три карты. Это означает меньшее количество сэмплеров текстур. Этот подход обычно используется для упаковки шероховатости, гладкости и/или металлика в одну текстуру. Его также можно применить к любой маске текстуры. Например, вы можете сохранить альфа-маску. Изображения с прозрачностью могут занимать больше памяти, поскольку для них требуется 32-битный формат, но, используя свободный канал для хранения альфа-маски, вы можете сохранить диффузную текстуру в 16-битном формате и уменьшить размер файла вдвое.
Используйте зеленый канал для хранения наиболее важных масок. Зеленый канал обычно содержит больше битов, поскольку наши глаза более чувствительны к зеленому и менее чувствительны к синему.
UV-карта проецирует 2D-текстуры на поверхность 3D-модели. Развертка UV - это процесс создания UV-карты.
- Лучше всего, если UV-острова - отдельные единицы развернутой текстуры - будут как можно более прямыми, чтобы упростить упаковку UV-островов и уменьшить количество неиспользуемого пространства. Прямой ультрафиолет также помогает избежать эффекта лестницы на текстурах.
- На мобильных платформах пространство текстур ограничено. Поэтому размер текстур обычно меньше, чем на консоли или ПК. Хорошая УФ-упаковка обеспечивает максимальное разрешение текстур.
- Для получения более качественных текстур рассмотрите возможность использования слегка искаженного UV, сохраняя его прямым.
- В некоторых случаях необходимо преувеличить и выделить края и штриховку, чтобы улучшить читаемость формы. Поскольку на мобильных платформах обычно используются Текстуры меньшего размера, может быть трудно передать все детали, которые необходимы в таком маленьком пространстве.
- Для мобильных приложений используйте меньше текстур и запекайте все дополнительные детали в одну текстуру. Это важно, потому что некоторые детали лучше запекать в саму диффузную текстуру, чтобы они были видны на маленьких экранах мобильных устройств.