Unity: Збірка під Android або «розмір має значення»

У деяких випадках необхідно працювати над зниженням розміру збірки для Андроїд. Наприклад, установка великовагових APK для користувачів мобільного інтернету може влетіти в копієчку. Перевищення розміру APK 50 Мб в Google Play виливається в додаткові труднощі при аплоад.



Одного разу ми у себе в компанії розробляли під Андроїд 2D-гру, яка рясніє картинками (більшість з областями прозорості) і різноманітними звуками, і зіткнулися з проблемою розміру АПК. Забігаючи вперед скажу, що вирішивши її і знизивши вагу в 1,5 рази, ми отримали в 1,5 рази більше скачувань. Змушує замислитися, чи не правда?

Намагаючись побороти проблему додатків-важкоатлетів, ми звернулися до чудової документації від Unity. З'ясувалося, що там ця тема обговорюється лише побіжно. Згадується, які саме аспекти впливають на розмір складання і як впливати на ці аспекти, щоб зробити APK менше, а також наведено трохи конкретики з приводу імпорту налаштувань зображень.

Іншу корисну інформацію з даного питання в інтернеті ми не знайшли. Тому провели невелике дослідження, результатами якого поспішаємо з вами поділитися.

Отже, згідно документації, розмір складання впливає:
  1. Розмір ассетов (зображення та звуки);
  2. Меші та анімаційні кліпи;
  3. Розмір включаються dll.
З мешами та імпортованими анімаційними кліпами ми не працювали, тому почнемо з ассетов.

ЗОБРАЖЕННЯ
Проаналізуємо, який внесок у розмір АРК вносять зображення у форматі PNG та JPG.

Зображення у форматі PNG
Для PNG цей внесок залежить від двох змінних»:
  1. Розмір картинки на файловій системі;
  2. Налаштування імпорту.
Ми зберегли 3 картинки в Photoshop з налаштуваннями: Compression->Smallest/Slow, Intrelaced: No. Картинка PNG розміром 295 Кбайт зайняла в збірці місця 236 Кбайт. Картинка 612 Кбайт зайняла 480 Кбайт. Картинка 21,2 Кбайт зайняла 23 Кбайт (природно, при однакових параметрах імпорту). Пропроциональность очевидна.

Далі ми зберегли першу картинку в Photoshop з налаштуваннями:Compression->None/Fast, Intrelaced: Yes. Отримали файл розміром 9000 Кбайт, проте в збірку він додав ті ж 236 Кбайт.

Це підтверджує слова з документації, про те, що Unity перекодовує всі ассеты у внутрішній формат. Очевидно, він приблизно відповідає формату PNG, збереженого в фотошопі з налаштуваннями: Compression->Smallest/Slow, Intrelaced: No. І Unity перекодовує всі PNG в цей формат, незалежно від початкового формату файлу.

Зображення у форматі JPG
Досліди однозначно показали, що зображення JPG вносять внесок у розмір складанняпропорційно своєму розміру. Поки не зовсім зрозуміло, як веде себе Unity у разі, якщо ассет знаходиться в форматі JPG. Ми зберегли ту ж саму (першу) картику в JPG і отримали дуже маленький файл на файловій системі (75 Кбайт). Однак у збірці він зайняв непомірних 767 Кбайт (*).

Ми проводили експеримент на великій кількості різних картинок, тут я навожу лише малу частину досліджень. В інших експериментах нам навпаки вдавалося знизити загальний розмір складання конвертуванням всіх файлів PNG в JPG.
Причин цього явища виявити поки не вдалося.
Швидше за все, знову має місце внутрішній формат Unity, проте точні принципи взаємодії чаклунського механізму Unity з ассетами JPG з'ясувати поки не вдалося.

Ще один спосіб роботи з JPG буде описаний нижче.

Висновки
  1. Судячи з усього, Unity бере до уваги і формат, в якому збережено зображення, і характеристики зображення і виконує стиснення за якимось внутрішнім принципам;
  2. Один принцип зовсім однозначна: зображення в однаковому форматі вносять внесок у розмір складання, прямо пропорційний (але НЕ РІВНИЙ) своїм розміром на файловій системі.
Налаштування імпорту впливають на розмір складання зовсім так, як це описано в доці (чим якісніша картинка, тим більший її внесок у розмір збірки). Тут прихованих особливостей не виявлено. (З іншими форматами зображень експерименти поки не проводилися.)

ЗВУКИ
Для звуків значення мають два параметри імпорту: Audio Format та ForceToMono.

Файли у форматі WAV займають більше місця в збірці, ніж файли в форматі MP3 (внесок в розмір складання приблизно дорівнює розміру файлу). Стерео WAV файл займе менше місця, якщо виставити ForceToMono = true. Точно такого ж ефекту можна досягти, якщо конвертувати файл в «моно» ще до імпорту (тоді ForceToMono не буде доступна в інспекторі).

Однак якщо для файлу WAV встановити налаштування імпорту AudioFormat = Compressed, то в збірці він займе місця стільки ж, скільки і відповідний MP3 файл вищої якості (Audacity: variable bitrate, 220-260 kbps). Тобто Unity самостійно кодує звук у формат MP3.

Для файлів в однаковому форматі діє принцип прямо пропорційного вкладу в розмір збірки.

Інші налаштування імпорту на розмір складання ніяк не впливають. Вони впливають на кількість місця, займане звуком в RAM.

А ТЕПЕР ПРО КОНКРЕТНІ КРОКИ ДО НАШОЇ МЕТИ
  1. За можливості знижувати розмір і якість вихідних файлів графіки.
    (1-a) Обрізка областей прозорості.
    У нашій грі використовувалося багато картинок із значними областями прозорості навколо зображення. Області прозорості лише на лічені відсотки збільшують розмір файлу і не дуже впливають на розмір збірки (хоча обрізка 102х немаленьких картинок заощадила нам 2 Мбайт). Але області прозорості збільшують використання RAM (оскільки там картинки представляються в BMP).

    Таким чином, рада: для зниження навантаження на ОЗП
    * уникати великих областей прозорості в зображеннях;
    * не формувати атласи з великими ділянками прозорості, особливо в NGUI.

    (Але це ми відволіклися від основної теми.)

  2. Зображень, які не мають прозорості та відображаються у найвищій якості, в налаштуваннях імпорту необхідно задати Advanced->RGB24. RGBA32 для них не має сенсу, а ось залишати Automatic Truecolor не рекомендується, тому що (як показав досвід) він може сприйнятися системою як RGBA32. А це є абсолютно зайвим при відсутності областей прозорості (додає ваги збірці і збільшує використання RAM).
  3. Знизити якість зображень у налаштуваннях імпорту за схемою: 32 bit -> 24 bit -> 16 bit, спостерігаючи за тим, щоб рівень якості зображення залишався в межах допустимого.
  4. Обмежити maxTextureSize для зображень, для яких це можливо з збереженням прийнятної якості.
  5. Ретельно вручну видаляти невживані ассеты в папках Resources перед процесом складання. Пам'ятайте, що для ассетов, що лежать в папках Resources, Unity НЕ виробляє автоматичне видалення, навіть якщо вони не призначено Інспектора.
  6. Для зображень JPG: змінити розширення файлу на bytes і він перетвориться в TextAsset. Після чого скористатися функцією Texture2D.LoadImage() для завантаження картинки. Слід пам'ятати, що ця функція навантажує процесор і може виявитися невідповідною у разі великих картинок, які необхідно дуже швидко завантажити. Однак цей спосіб найчастіше допомагає значно полегшити складання.
  7. Зменшити розмір звукових файлів до мінімально можливого розміру (з урахуванням вимог до якості). По можливості використовувати MP3, а не WAV. Але якщо потрібні MP3 найвищої якості, можна використати і WAV-файл з налаштуванням імпорту AudioFormat = Compressed (Unity перекодовує самостійно). По можливості використовувати Mono замість Stereo. Для WAV-файлів — виставляти налаштування імпорту ForceToMono = true
Після виконання кожного пункту бажано перевіряти отриманий ефект. Оскільки в поведінці Unity все ж є частка магії.

Кілька слів про dll
Документ наводить список обов'язково включаються до складання dll і закликає мінімізувати кількість додаткових dll (особливо важких). Зокрема, по можливості не використовувати System.dll (додає до APK 2 Мбайт). Однак навіть якщо ми будемо уникати посилань на методи з цієї бібліотеки, System.dll все одно (за станом на Unity 4.5.5) включається в збірку, так як її підтягує обов'язкова Mono.Security.dll. Тому, виходить, що офіційна документація Unity у цьому місці не зовсім релевантна.

А ось використання інших (необов'язкових) dll бажано уникати в ім'я зниження розміру складання.

(Прохання розглядати даний матеріал як більш-менш систематизовані результати дослідження, а не як універсальне керівництво до дії. Буду дуже радий коментарів, зауважень, конструктивної критики, запереченням, пропозицій, доповнень. І, звичайно, невимовно радий буду дізнатися, які прийоми застосовують колеги з інших компаній для вирішення обговорюваного питання.)

Дякую за увагу.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.