24 нояб. 2011 г.

Уменьшение (оптимизация) размера приложения в unity3d. Часть 2

А теперь давайте поговорим об оптимизации текстур и других вещах, помогающих сделать наш билд меньше (вернее упихать в заветные 20 метров). На официальной страничке unity3d описано несколько приемов как сэкономить размер приложения этими способами. Итак, предлагается следующее.
Оптимизация используемых текстур включает в себя в первую очередь использование сжатых форматов текстур там где только возможно. Если сжатие не уменьшит занимаемый размер, то можно попробовать уменьшить размер текстуры. Что в принципе логично: зачем вам текстура размеров 2048, если у вас экран 1024х768 и она занимает места не больше, чем экран?


В новом unity3d (3.4) настройка текстуры выглядит как изображено выше. Итак, Aniso Level, Filter Mode, Wrap Mode оставляем без изменений. Начнем с Texture Type. Выставляем Advanced и радуемся: здесь можно полностью настроить текстуру как нашей душе угодно (и как позволяет редактор unity3d). Non power of 2 выставляем в ToSmaller или ToLarger. Generate Cubemap в моей 2d-игре не нужна, отключил, впрочем как и Alpha from grayscale тоже не пользуюсь за ненадобностью. Отключите Generate Mip Maps - это также позволит сэкономить на размере текстуры. Normal Map и Light Map отключаем, если не надо. Максимальный размер текстуры выставляем как можно более меньший. Что по поводу сжатия, то тут надо экспериментировать. Обычно наилучшим эффектом обладает сжатие DXT5.

Далее приведу таблицу соотношения размеров изображения в зависимости от типа сжатия (взято из того же источника):

Desktop

СжатиеЗанимаемая память
RGB Compressed DXT10.5 bpp (bytes/pixel)
RGBA Compressed DXT51 bpp
RGB 16bit2 bpp
RGB 24bit3 bpp
Alpha 8bit1 bpp
RGBA 16bit2 bpp
RGBA 32bit4 bpp

iOS
RGB Compressed PVRTC 2 bits0.25 bpp (bytes/pixel)
RGBA Compressed PVRTC 2 bits0.25 bpp
RGB Compressed PVRTC 4 bits0.5 bpp
RGBA Compressed PVRTC 4 bits0.5 bpp
RGB 16bit2 bpp
RGB 24bit3 bpp
Alpha 8bit1 bpp
RGBA 16bit2 bpp
RGBA 32bit4 bpp

Для iOS, как мы видим, выгоднее использовать PVRTC 2 bits с альфа-каналом или без (все зависит от типа вашей текстуры). Однако, искажения, которые могут присутствовать в данном типе сжатия могут кого-то не устроить, тогда следует перейти на другой тип сжатия. Выбор за вами, экспериментируйте.

Также можно оптимизировать меши и анимации. Сжатие может быть включено в настройках импорта меша (Mesh import settings).

Еще возможно уменьшить количество dll, включенных в ваш проект. Это я рассматривал в прошлой статье по оптимизации (см. оптимизация, часть 1).

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

Спасибо за внимание, если что-то непонятно или недосказано с вопросами и предложениями прошу в комментарии.

4 комментария:

  1. Generate Mip Maps желательно не отключать, если текстура используется в нескольких размерах.

    ОтветитьУдалить
  2. мипмапы можно отключать если игра в 2д, в 3д такой фокус не очень полезен!

    если ненужные ассеты лежат в папке Resources - они всё равно включатся в билд ).

    ОтветитьУдалить
  3. > мипмапы можно отключать если игра в 2д,
    > в 3д такой фокус не очень полезен!

    > если ненужные ассеты лежат в папке
    > Resources - они всё равно включатся в билд ).

    Спасибо, учту ;)

    ОтветитьУдалить
  4. Скажите пожалуйста кто-нибудь знает как запекать текстуры в Unity3D. Это нужно делать в Autodesk 3D Max или можно в Unity3D сделать (где-то на форумах я случайно прочитал об этом)? Кто знает, подскажите.

    ОтветитьУдалить