Перейти к содержимому

Compression method unity какой выбрать

  • автор:

Unity уменьшение размера файла на устройстве часть 1

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

В этой статье будут рассмотрены основные способы оптимизации игры на Unity по уменьшению размера файла на устройстве. В основном статья подходит для мобильных платформ, так как на ПК игры весом в 100Гб уже стали нормой. Многие методы и настройки будут нацелены именно на мобильные устройства в частности Android.

1) Самый простой и порой очевидный способ «Удалить все не используемые ассеты»

Когда разработка идет полным ходом, в игру добавляется много разных ассетов. Но мало кто занимается удалением не используемых. А ведь это не только уменьшает занимаемое место будущей игры, но и очищает структуру проекта.

2) Выбрать метод сжатия

File > Build settings > Compression method

На Android сжатие по умолчанию — ZIP, что дает несколько лучшие результаты сжатия, чем LZ4HC. Однако ZIP-данные распаковываются медленнее. Что означает, что простая игра может запускать несколько минут.

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

3) Выбрать метод сжатия текстур

File > Build settings

Большинство современных графических процессоров Android поддерживают формат сжатия ASTC. Если вам нужна поддержка старых устройств, то все графические процессоры, работающие под управлением Vulkan, Metal или OpenGL ES 3.0, поддерживают формат ETC2.

Для еще более старых устройств обычно доступен только формат ETC. Недостатком является отсутствие прямой поддержки альфа-канала (прозрачности изображения) .

4) Выбрать целевую архитектуру

Player settings > other settings > Соnfiguration > target architectures

Если вы не планируете выпускать игру под старые платформы, то можно выбрать ARM64. ARM7 старые телефоны, ARM64 новые телефоны.

Chrome OS это операционная система, используемая на устройствах Chromebook. Для обычных телефонов и планшетов включать поддержку этой платформы не обязательно.

5) Разделить файловые сборки по архитектурам

Player settings > other settings > Configuration > target architectures > Split APKs by target architecture (Experimental)

Не работает в большинстве магазинов приложений. Настройка нацелена на Google play. Благодаря ей в магазине будет хранится несколько сборочных файлов для разных архитектур. Так сборочные файлы будут меньше требовать памяти на устройстве и будут более оптимизированы.

6) Поиск не используемых скриптов

Player settings > other settings > Optimization > Manager scripting level = high

Эта настройка будет автоматический искать не используемый код. Таким образом будет произведена оптимизация пространства на устройстве и производительность приложения

7) Выбор графического api

Player settings > other settings > graphics api’s= opengles2

Если игра не требует высокого уровня графики, вы можете выбрать графический api полегче (opengles2).

8) Переключиться на промежуточный с++

Player settings > other settings > Configuration > Scripting backend = ILL2CPP

В Unity есть 2 типа компиляции. Mono – скрипты компилируются по запросу. И ILL2CPP – скрипты компилируются перед запуском. Mono подходит для разработки и тестов. Так как здесь требуется мгновенная компиляция. ILL2CPP – подходит для релиза, когда игра уже готова к выпуску.

9) Выбрать способ компиляции

Player settings > other settings > Configuration > C++ compiling config = Release

Debug –подходит для доработки исправления багов, если игра уже выпущена и перенастраивать нет времени.

Release – компиляция для выпускаемой сборки. Происходит намного дольше. Но в результате сборка будет хорошо оптимизована и уменьшена в размерах.

Master – Улучшенный метод компиляции. В маленьких проектах будет слабый эффект. В больших проектах работает лучше. Требует очень большого времени компиляции.

10) Enable Roslyn Analyzers

Player settings > other settings > Configuration > 10) Enable Roslyn Analyzers = false

Отключите этот параметр для компиляции без DLL анализатора Roslyn, которые могут присутствовать в вашем проекте.

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

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

Зачастую важно сохранять размер собранного приложения на минимальном уровне, особенно если речь о разработке под мобильные устройства, или для магазинов приложений, имеющих ограничения по размеру. Первый шаг в процессе уменьшения размера — определить, какие ассеты больше всего занимают места, т.к. такие ассеты — первые кандидаты для оптимизации. Вы можете найти эту информацию в логе редактора, сразу после совершения сборки (выберите 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, при сборке проигрывателя

Уменьшение размера мобильной .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”). Многие редко используемые в играх процедуры исключены из этого профиля для снижения потребления памяти. Однако, это также значит, что не будет правильно работать код с зависимостями от этих процедур. Эта опция может быть полезна для оптимизации, но вам следует проверить, работает ли существующий код после применения этой опции.

Сжатие данных сетки

Вы можете сжать mesh основной графический примитив Unity. Меши составляют большую часть ваших 3D-миров. Unity поддерживает триангулированные или четырехугольные полигональные сетки. Поверхности Nurbs, Nurms, Subdiv должны быть преобразованы в полигоны. Подробнее
Просматривайте в Словарь данные в Unity, чтобы уменьшить их размер и повысить производительность. Unity предоставляет два способа сжатия мешей. Они работают по-разному и влияют на разные аспекты производительности:

  • Сжатие вершин — это параметр, который влияет на каждую сетку в вашем проекте. Это позволяет вам использовать форматы данных более низкой точности в ваших сетках. Это уменьшает размер данных сетки в памяти, немного уменьшает размер файла и может повысить производительность графического процессора. Потенциальным недостатком является потеря точности.
  • Сжатие сетки — это параметр, влияющий на отдельные сетки. Он сжимает данные сетки на диске, что уменьшает размер файла. Потенциальными недостатками являются увеличение времени загрузки, увеличение использования временной памяти при загрузке и возможность сжатия метода хранения данных, количество места для хранения, которое ему требуется. См. Сжатие текстур, Сжатие анимации, Сжатие звука, Сжатие компоновки.
    См. в артефактах Словарь .

Вы можете использовать оба метода сжатия в одном проекте, но не в одном меше. Если вы применяете сжатие сетки к сетке, Unity не применяет сжатие вершин к этой сетке.

Примечание. Настройки Unity по умолчанию для Vertex Compression и Mesh Compression подходят для большинства проектов. Вы должны изменять эти настройки, только если у вас возникла проблема, и оценить результаты, чтобы убедиться, что изменения помогли.

Сжатие вершин

Настройка Vertex Compression позволяет использовать форматы данных более низкой точности для всех сеток в вашем проекте. Вы делаете это, настраивая тип данных для определенных каналов данных.

Вы можете изменить тип данных для данного канала с FP32 (с плавающей запятой32, 32-разрядное число с плавающей запятой) на FP16 (с плавающей запятой16, также известный как число с плавающей запятой половинной точности). Формат FP16 хранит числа с меньшим количеством знаков после запятой, чем числа FP32, что означает, что он занимает меньше места, но обеспечивает немного меньшую точность.

Данные, преобразованные из FP32 в FP16, занимают меньше места в памяти и немного меньше места на диске. На графическом процессоре данные используют меньшую пропускную способность памяти, что может немного повысить производительность графического процессора.

Техника сжатия вершин сжимает сетку в соотношении, которое зависит от того, сколько атрибутов вершин вы выбрали для сжатия. Коэффициент сжатия обычно составляет около 1,45x, когда вы сжимаете нормали, касательные, цвет и три набора координат UV.

Ограничения сжатия вершин

Для использования сжатия вершин сетка должна соответствовать следующим требованиям:

  • Свойство Read/Write Enabled для сетки должно быть отключено. Это свойство можно изменить на вкладке «Модель» окна «Параметры импорта модели».
  • Сетка не должна быть оболочкой.
  • Целевая платформа должна поддерживать значения FP16.
  • Для модели, содержащей сетку, для параметра Сжатие сетки должно быть установлено значение «Выкл.»

Если сетка не соответствует ни одному из этих требований, Unity не применяет сжатие вершин к этой сетке, и все каналы данных в сетке используют числа точности FP32.

Настройка сжатия вершин

Чтобы изменить настройки сжатия вершин:
1. Откройте настройки проигрывателя (меню: Правка > Настройки проекта > Проигрыватель).
2. Откройте подменю Другие настройки и перейдите к заголовку Оптимизация.
3. Откройте раскрывающийся список Сжатие вершин и выберите любой канал, чтобы включить или отключить сжатие для этого канала. Вы также можете выбрать Нет, чтобы отключить сжатие для всех каналов, или выбрать Все, чтобы включить сжатие для всех каналов.

По умолчанию для Vertex Compression установлено значение Смешанное, которое Unity отображает, когда в раскрывающемся списке активны несколько вариантов. По умолчанию Unity использует сжатие вершин для следующих каналов:

  • Normal
  • Tangent
  • Tex Coord 0
  • Tex Coord 2
  • Tex Coord 3

Unity сжимает эти каналы по умолчанию, потому что в большинстве случаев эта комбинация настроек обеспечивает хорошее сочетание сохраненной памяти без существенных изменений во внешнем виде сетки. Unity не сжимает другие настройки, Position и Tex Coord 1, по умолчанию, потому что они, скорее всего, повлияют на внешний вид меша и не обеспечивают значительного сокращения использования памяти. Если вы намерены включить сжатие вершин для каналов Position и Tex Coord 1, вам следует протестировать настройки, чтобы убедиться, что они не вызывают артефактов в ваших сетках.

Сжатие сетки

Вы можете использовать параметр «Сжатие сетки», чтобы сжать данные сетки для данного актива модели на диске. Алгоритм Mesh Compression является более агрессивным, чем метод Vertex Compression, что приводит к более высоким коэффициентам сжатия и, следовательно, к меньшим размерам файлов. Однако у него есть и другие недостатки.

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

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

Ограничения сжатия сетки

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

Кроме того, относительно высокая степень сжатия означает, что нежелательные артефакты могут появляться, когда Unity распаковывает сетку. Чтобы избежать этих артефактов, следует протестировать каждую опцию для сетки, которую вы хотите сжать, и убедиться, что она отображается правильно.

Настройка сжатия сетки

Параметр «Сжатие сетки» в окне настроек импорта модели.

Чтобы использовать параметр сжатия сетки:

Доступны следующие значения: Высокий, Средний, Низкий или Выкл. В следующей таблице показаны типичные коэффициенты сжатия для каждого из этих параметров:

Значение Вершины Нормалы Касательные УФ Цвет
Off 1.0 1.0 1.0 1.0 1.0
Low 1.6 4.6 4.4 2.0 1.0
Medium 2.0 5.6 5.3 3.2 1.3
High 3.2 7.4 6.7 4.0 2.0

Коэффициенты сжатия для метода сжатия сетки

Примечание. В столбце «Цвет» в приведенной выше таблице показаны соотношения для сетки, в которой используется формат UNorm8. Для сетки, использующей формат FP32 для цветов вершин, коэффициенты равны 4,0 при настройке «Низкая», 5,3 при настройке «Средняя» и 8,0 при настройке «Высокая».

Unity «уменьшение размера файла на устройстве» Часть 2

В этой статье будет разбор, как уменьшить размер ассетов. В частности медиа ассетов(музыка, видео, изображения) . Прежде чем начать оптимизацию ассетов, нужно понять, какие ассеты наиболее подходящие кандидаты. Чтобы оптимизировать в первую очередь их.

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

Для этого нужно открыть консоль Unity. Если она не открыта, то ее можно открыть Window> General > Console. Справа сверху нажать на троеточие и открыть OpenEditorLog.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *