Version: 5.3 (switch to 5.4b)
Часто задаваемые вопросы об AssetBundles
Social API

Уменьшение размера файла сборки

Зачастую важно сохранять размер собранного приложения на минимальном уровне, особенно если речь о разработке под мобильные устройства, или для магазинов приложений, имеющих ограничения по размеру. Первый шаг в процессе уменьшения размера - определить, какие ассеты больше всего занимают места, т.к. такие ассеты - первые кандидаты для оптимизации. Вы можете найти эту информацию в логе редактора, сразу после совершения сборки (выберите Open Editor Log в выпадающем меню маленькой иконки в правом верхнем углу окна Console).

Лог редактора сразу после сборки
Лог редактора сразу после сборки

Лог предоставляет сводку по ассетам, разбитым по типам и затем список отдельных ассетов, отсортированных по размеру. Как правило, текстуры, музыка и видео занимают больше всего места, в то время как скриптами, уровнями и шейдерами часто можно пренебречь. Учтите, что File Headers (заголовки файлов) в сводке - это не ассеты как таковые. Заголовки обычно добавляются к “сырым” файлам ассетов для сохранения настроек и ссылок. Обычно заголовки не значительно влияют на размер файлов ассетов, но значение может оказаться и большим, если у вас много больших ассетов в папке Resources.

Лог помогает выявить ассеты, которые вы, возможно, пожелаете удалить или оптимизировать, но вам стоит учитывать следующее перед тем как начать работу:

  • Unity перекодирует импортированные ассеты в собственные внутренние форматы, поэтому выбор исходного формата ассета не имеет значения. Например, если у вас в проекте есть Photoshop текстура с множеством слоёв, они будут объединены, а сама текстура будет сжата перед сборкой проекта. Экспорт текстуры в виде PNG никак не повлияет на размер сборки, так что вам следует придерживаться форматов, наиболее удобных для вас при разработке.

  • Unity отсеивает большинство неиспользуемых ассетов во время сборки, так что вы ничего не выиграете, вручную удаляя ассеты из проекта. Ассеты, которые не подвергаются отсеиванию - скрипты (они в любом случае занимают очень мало места) и всё, что находится в папке Resources (т.к. Unity не может определить какие из них будут использоваться, а какие - нет). Помня об этом, вам следует убедиться, что в папке Resources находятся только те ассеты, которые действительно нужны во время игры. Кроме того, вместо хранения ассетов в папке Resources, вы можете выбрать AssetBundles для их динамической загрузки, чтобы ещё больше снизить размер сборки.

Советы по уменьшению размера сборки

Текстуры

Зачастую, больше всего места в сборке занимают текстуры. Первое, что следует сделать - использовать сжатые форматы текстур (DXT (для настольных платформ) или PVRTC) там, где это возможно.

Если это не приведёт к уменьшению размера, попробуйте снизить качество текстур. Хитрость тут в том, что вам не нужно менять исходный контент. Просто выберите текстуру в окне Project и измените значение свойства Max Size (максимальный размер) в настройках импорта. Можно приблизить объект, на котором используется выбранная текстура, и подобрать значение Max Size так, чтобы вы не замечали ухудшения качества текстуры в окне Scene (Scene View).

Изменение максимального размера текстуры повлияет лишь на разрешение текстуры в игре, и не изменит ваш ассет текстуры
Изменение максимального размера текстуры повлияет лишь на разрешение текстуры в игре, и не изменит ваш ассет текстуры

В следующей таблице показано, как много места занимают разные форматы изображений, в байтах на пиксель:

Сжатие Потребление памяти (байты/пиксель)
Standalone & WebGL
RGB Crunched DXT1 variable
RGBA Crunched DXT5 variable
RGB Compressed DXT1 0.5 bpp
RGBA Compressed DXT5 1 bpp
RGB 16bit 2 bpp
RGB 24bit 3 bpp
Alpha 8bit 1 bpp
RGBA 16bit 2 bpp
RGBA 32bit 4 bpp
iOS
RGB Compressed PVRTC 2 bits 0.25 bpp (байты/пиксель)
RGBA Compressed PVRTC 2 bits 0.25 bpp
RGB Compressed PVRTC 4 bits 0.5 bpp
RGBA Compressed PVRTC 4 bits 0.5 bpp
RGB 16bit 2 bpp
RGB 24bit 3 bpp
Alpha 8bit 1 bpp
RGBA 16bit 2 bpp
RGBA 32bit 4 bpp
Android
RGB Compressed DXT1 0.5 bpp (байты/пиксель)
RGBA Compressed DXT5 1 bpp
RGB Compressed ETC1 0.5 bpp
RGB Compressed PVRTC 2 bits 0.25 bpp (байты/пиксель)
RGBA Compressed PVRTC 2 bits 0.25 bpp
RGB Compressed PVRTC 4 bits 0.5 bpp
RGBA Compressed PVRTC 4 bits 0.5 bpp
RGB 16bit 2 bpp
RGB 24bit 3 bpp
Alpha 8bit 1 bpp
RGBA 16bit 2 bpp
RGBA 32bit 4 bpp

Формула занимаемого на диске места такова: ширина * высота * bpp. Если вы используете мипмапы, тогда размер на диске будет примерно на треть больше, чем при обычном единичном изображении.

По умолчанию, Unity сжимает все текстуры при импорте. Для ускорения рабочего процесса в редакторе, вы можете отключить сжатие в настройках редактора (флажок Compress Assets on Import), но при этом текстуры всё равно будут сжиматься при сборке, независимо от этой настройки.

Меши и анимации

Меши и импортированный анимационные клипы могут сжиматься, чтобы занимать меньше места в сборке вашей игры. Сжатие может быть включено в настройках импорта меша.

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

Учтите, что сжатие меша снижает только физических размер файлов, но не объём используемой памяти при выполнении программы. А вот снижение количества ключевых кадров в анимации (значение Keyframe reduction у свойства Anim. Compression в настройках импорта) уменьшает и физический размер файлов, и потребление памяти во время выполнения программы, потому рекомендуется всегда оставлять эту настройку включенной.

DLL файлы

По умолчанию, Unity включает в сборку только эти DLL файлы:

  • mscorlib.dll
  • Boo.Lang.dll
  • UnityScript.Lang.dll
  • UnityEngine.dll

При работе над игрой рекомендуется избегать использования зависимостей из System.dll или System.Xml.dll. По умолчанию, Unity не включает эти библиотеки в к сборку проигрывателя, но если в своём коде вы используете их классы, библиотеки будут включены в сборку. Эти DLL файлы добавят к размеру сборки проигрывателя около одного мегабайта. Если в вашей игре требуется работа с XML, вы можете использовать библиотеки вида Mono.Xml.zip в качестве небольшой по размерам альтернативы системным библиотекам. Хоть большинство дженерик контейнеров содержится в mscorlib, но Stack<> и некоторые другие находятся в System.dll, так что постарайтесь избегать их использования по возможности.

Как вы можете видеть, Unity включает System.Xml.dll и System.dll, при сборке проигрывателя
Как вы можете видеть, Unity включает System.Xml.dll и System.dll, при сборке проигрывателя

Уменьшение размера мобильной .NET библиотеки

Для некоторых мобильных устройств, Unity поддерживает два уровня совместимости .NET API: .NET 2.0 и подмножество .NET 2.0 (.NET 2.0 subset). Вы можете выбрать соответствующий уровень для вашей сборки в параметрах проигрывателя.

Профиль .NET 2.0 API соответствует полной версии .NET 2.0 API. Большинство подпрограмм библиотеки полностью реализованы, потому использование этой опции позволяет получить наилучшую совместимость с уже существующим кодом. Однако, в большинстве игр не требуется полная версия библиотеки и ненужный код занимает ценное пространство в памяти.

Во избежание излишнего потребления памяти, Unity поддерживает профиль подмножества .NET 2.0 API. Он очень похож на профиль Mono “monotouch”, так что многие из ограничений профиля “monotouch” также распространяются и на профиль .NET 2.0 Subset редактора Unity (здесь можно получить дополнительную информацию об ограничениях профиля “monotouch”). Многие редко используемые в играх процедуры исключены из этого профиля для снижения потребления памяти. Однако, это также значит, что не будет правильно работать код с зависимостями от этих процедур. Эта опция может быть полезна для оптимизации, но вам следует проверить, работает ли существующий код после применения этой опции.

Часто задаваемые вопросы об AssetBundles
Social API