
Советы по оптимизации мобильных приложений для технических художников - Часть I
Что вы получите с этой страницы: Советы по оптимизации художественных ресурсов для разработчиков мобильных игр, работающих в Unity. Это первая из двух статей по оптимизации искусства для мобильных игр.
Вы можете найти много других советов по оптимизации мобильных приложений в этом обширном электронном учебнике и этом курсе Unity Learn по оптимизации 3D-искусства для мобильных приложений.

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

Используйте уровни детализации (LOD)
Когда объекты удаляются на расстояние, Уровень детализации (LOD) может регулировать или переключать их на использование более простых сеток с более простыми материалами и шейдерами для улучшения производительности GPU.
Больше советов по подготовке LOD
- Удаляйте больше полигонов на плоских участках и не используйте плотные области треугольников на объектах с более низким LOD.
- LOD также может применяться к сложности шейдеров. Шейдер и материал могут быть оптимизированы для 3D объектов, которые находятся дальше. Например, вы можете уменьшить количество текстур, которые использует объект, по мере его удаления от камеры.
- Часто стоит уменьшить количество треугольников между каждым уровнем LOD на 50%.
- Проверьте, как выглядит LOD на разных расстояниях от камеры.
- Чистая топология необходима для персонажей и объектов, которые деформируются или анимируются.
- Не зацикливайтесь на идеальной топологии. Игрок или конечный пользователь не увидит каркас 3D модели, как только вы примените текстуру и материал.
Когда не использовать LOD
LOD не подходит для каждой ситуации. Например, избегайте его использования в приложении, где как вид камеры, так и объекты статичны, или где объект уже использует низкое количество полигонов. LOD имеет накладные расходы по памяти и больший размер файла, потому что данные сетки должны быть сохранены, чтобы их можно было использовать в реальном времени.

Объединяйте меши и скрывайте объекты
Вы можете объединить несколько сеток в одну, чтобы уменьшить количество вызовов отрисовки, необходимых для рендеринга. Чтобы применить эту технику, создайте пустой GameObject в иерархии и сделайте его родителем мешей, которые вы хотите объединить, затем прикрепите скрипт, реализующий метод Mesh.CombineMeshes(), к родительскому GameObject.
Используйте Occlusion Culling
Объекты, скрытые за другими объектами, все еще могут рендериться и потреблять ресурсы. Используйте Occlusion Culling, чтобы исключить их.
Хотя отсечение фрустрации вне поля зрения камеры происходит автоматически, отсечение окклюзий — это запеченный процесс. Просто отметьте ваши объекты как Static Occluders или Static Occludees, затем запеките через диалог Window > Rendering > Occlusion Culling . Хотя это не обязательно для каждой сцены, отсечение может улучшить производительность во многих случаях. Посмотрите учебник Работа с Occlusion Culling для получения дополнительной информации.

Импорт моделей
Вот несколько хороших советов, которые стоит учитывать при импорте ваших моделей.
- Тип анимации: При импорте FBX Mesh, который не содержит данных анимации, установите тип анимации в None на вкладке Rig в настройках импорта. Когда вы помещаете свой меш в иерархию, эта настройка гарантирует, что Unity не создаст неиспользуемый компонент Animator.
- Отключить риги и BlendShapes: Если вашему мешу не нужна скелетная анимация или анимация BlendShape, отключите эти опции, где это возможно.
- Отключить нормали и тангенты: Если вы абсолютно уверены, что материал меша не будет нуждаться в нормалях или тангентах, снимите отметку с этих опций для дополнительной экономии.
- Настройки импорта: Если ваша модель не изменяется во время выполнения, отключите опцию Read/Write Enabled на вкладке Model в настройках импорта, чтобы предотвратить создание копии в памяти.
- Статическая/Динамическая пакетировка: Статическая батчинг - это общая техника оптимизации, которая уменьшает количество вызовов отрисовки. Она идеальна для объектов, состоящих из большого количества вершин, которые не движутся, не вращаются и не масштабируются во время рендеринга. Проверьте статический режим в инспекторе, содержащем Mesh Renderer вашей целевой модели.

Размеры текстур и цветовое пространство
Текстуры могут быть разного размера. Снижение размера текстур, которые требуют меньшей детализации, поможет уменьшить пропускную способность. Например, диффузная текстура может быть установлена на 1024 x 1024, а связанная карта шероховатости/металличности может быть установлена на 512 x 512. Старайтесь избирательно уменьшать размер текстуры и всегда проверяйте, ухудшилось ли качество визуализации после этого.
Большинство программного обеспечения для текстурирования работает с текстурами и экспортирует их, используя цветовое пространство sRGB.
Мы рекомендуем использовать диффузные текстуры в цветовом пространстве sRGB. Текстуры, которые не обрабатываются как цвет, не должны находиться в цветовом пространстве sRGB. Примеры таких текстур включают металлические, шероховатые и нормальные карты, так как карты используются как данные, а не как цвет. Использование sRGB в этих картах приведет к неправильному визуальному отображению материала.
Примечание. Убедитесь, что настройка sRGB (цветная текстура) в окне инспектора не имеет отметок рядом с шероховатостью, спекулярными, нормальными картами или подобными элементами.

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

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

Фильтрация текстур
Фильтрация текстур часто улучшает качество текстур в сцене, но также может ухудшить производительность, так как достижение лучшего качества текстур часто требует больше обработки. Фильтрация текстур иногда может составлять до половины потребления энергии GPU. Выбор более простых и подходящих фильтров текстур может помочь снизить энергетические требования приложения.
- Ближайшая/Точечная фильтрация: Это самая простая и наименее вычислительно интенсивная форма фильтрации текстур, хотя при близком рассмотрении эта фильтрация может сделать текстуры квадратными.
- Билинейная фильтрация: Билинейная фильтрация выбирает и усредняет соседние тексели для окраски пикселей в текстуре. В отличие от ближайшей фильтрации, билинейная фильтрация приводит к менее квадратным пикселям, так как пиксели имеют плавный градиент. Побочным эффектом билинейной фильтрации является то, что текстуры будут выглядеть размытыми при близком просмотре.

Размеры текстур и цветовое пространство
Большая часть вашей памяти, вероятно, будет использоваться для текстур, поэтому настройки импорта здесь критически важны. В общем, старайтесь следовать этим рекомендациям при импорте ваших активов.
- Уменьшите максимальный размер: Используйте минимальные настройки, которые дают визуально приемлемые результаты. Это неразрушающее и может быстро уменьшить вашу память текстур.
- Используйте степени двойки (POT): Unity требует размеры текстур в степенях двойки для мобильных форматов сжатия текстур (PVRCT или ETC).
- Атлас ваших текстур: Размещение нескольких текстур в одной текстуре может уменьшить количество вызовов отрисовки и ускорить рендеринг. Используйте Unity Sprite Atlas или сторонний TexturePacker для создания атласа ваших текстур.
- Отключите опцию "Чтение/Запись включено": При включении эта опция создает копию как в памяти, доступной для ЦП, так и для ГП, удваивая объем памяти текстуры. В большинстве случаев оставляйте это отключенным. Если вы генерируете текстуры во время выполнения, обеспечьте это через Texture2D. Примените, передав makeNoLongerReadable установленный на true.
- Отключите ненужные мипмапы: Мипмапы не нужны для текстур, которые остаются постоянного размера на экране, таких как 2D спрайты и графика пользовательского интерфейса. Оставьте мипмапы включенными для 3D моделей с изменяющимся расстоянием от камеры.
- Используйте билинейную фильтрацию: Это поможет достичь баланса между производительностью и визуальным качеством.
- Используйте трилнейную фильтрацию выборочно: Это требует большей пропускной способности памяти, чем билинейная фильтрация.
- Используйте билинейную и 2x анизотропную фильтрацию: Выбирайте эти вместо трилнейной и 1x анизотропной, чтобы улучшить как внешний вид, так и производительность.
- Держите уровень анизотропии низким: Используйте уровень выше 2 только для критически важных игровых активов.

Сжимайте текстуры
Используйте адаптивное масштабируемое сжатие текстур (ATSC) как для iOS, так и для Android. Подавляющее большинство игр в разработке, как правило, нацелены на минимальные устройства, поддерживающие сжатие ATSC. Единственные исключения:
- игры для iOS, нацеленные на устройства A7 или ниже (например, iPhone 5, 5S и т. д.): Используйте PVRTC
- игры для Android, нацеленные на устройства до 2016 года: Используйте сжатие текстур Ericsson (ETC2)

Используйте каналы текстур для упаковки нескольких текстур в одну
Упаковка каналов текстур помогает сэкономить память текстур, так как вы можете поместить три карты в одну текстуру. Это означает меньшее количество выборок текстур. Этот подход обычно используется для упаковки шероховатости, гладкости и/или металлического блеска в одну текстуру. Он также может быть применен к любой маске текстуры. Например, вы также можете хранить альфа-маску. Изображения с прозрачностями могут занимать больше памяти, так как требуют 32-битного формата, но, используя свободный канал для хранения альфа-маски, вы можете сохранить диффузную текстуру в 16-битном формате и эффективно уменьшить размер файла вдвое.
Используйте зеленый канал для хранения самой важной маски. Зеленый канал обычно имеет больше бит, так как наши глаза более чувствительны к зеленому и менее чувствительны к синему.

UV-развёртка
UV-карта проецирует 2D текстуры на поверхность 3D модели. UV-раскрытие — это процесс создания UV-карты.
- Лучшей практикой является сохранение UV-островов, отдельных единиц неразвернутой текстуры, как можно более прямыми, чтобы упростить упаковку UV-островов и уменьшить потери пространства. Прямой UV также помогает предотвратить эффект лестницы на текстурах.
- На мобильных платформах пространство текстур ограничено. Таким образом, размер текстуры обычно меньше, чем на консоли или ПК. Хорошая упаковка UV обеспечивает максимальное разрешение ваших текстур.
- Рассмотрите возможность слегка искаженного UV, сохраняя UV прямым для текстур лучшего качества.
- В некоторых случаях вам нужно будет преувеличить и выделить края и тени, чтобы улучшить читаемость формы. Поскольку мобильные платформы обычно используют меньшие текстуры, может быть трудно захватить все необходимые детали в этом небольшом пространстве.
- Для мобильных приложений используйте меньше текстур и объединяйте любые дополнительные детали в одну текстуру. Это важно, потому что некоторые детали лучше всего запекать на саму диффузную текстуру, чтобы убедиться, что эти детали видны на маленьких мобильных экранах.