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

В этой статье будут рассмотрены основные способы оптимизации игры на 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 раза. В следующих статьях будут описаны другие методы.

Комментарии (3)


  1. Suvitruf
    24.12.2022 15:19

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

    Не забываем при этом про аннотации и link.xml, если у вас есть динамический код/рефлексия.


  1. dm_bondarev
    25.12.2022 04:38
    +5

    Жаль, что автор не захотел разобраться в теме, перемешал полезное с ерундой. Невозможно оптимизировать то, что нельзя измерить. На стороне юнити нужно было использовать https://docs.unity3d.com/Packages/com.unity.build-report-inspector@latest и Editor.log. Билды, раз уж речь в основном про андроид, рассматривать в https://7zip.org (эта же информация есть build report inspector, но в 7zip удобнее упорядочить по размеру и сравнить между собой). Можно было взять какой-нибудь туториальный проект со стора и на его примере разобрать методы. Упомянуть, почему вообще приходится бороться с размером. Разработчики обычно начинают о нем заботиться, когда сталкиваются с ограничениями в сторе - 20 МБ для Instant и 150 МБ для условного apks (сборки под конкретную платформу, получаемой из aab). Со стороны пользователя размер билда тоже важен, но где для него плюс - в большую или меньшую сторону, зависит от жанра. Он может посчитать, что ему "недоложили".Так вот, из Editor.log можно получить проценты по типам ассетов https://docs.unity3d.com/uploads/Main/FileSizeOptimization.png. Начинать нужно конечно с того что "весит" больше всего, но хорошо бы пройтись по оптимизациям всех типов. Про текстуры или звук написано довольно много (но есть неочевидное - вынести в докачиваемые assetbundles или положить .jpg в StreamingAssets), а вот как например уменьшить размер анимаций или шейдеров? Или что такое File headers? Иногда они занимают очень большой процент. Потом переходить к оптимизации кода - отключение в Package Manager лишних модулей, удаление лишних пакетов. Все это сопровождать цифрами - сделали это, время билда такое, новый размер билда такой. Чтобы можно было оценить влияние и убедиться, что оно вообще есть (Roslyn Analyzers, серьезно?). Затем уже экспериментировать с настройками Player'a. Потом, если речь про андроид, то спуститься "ниже" к минификаторам, настройке gradle (сжатие или не сжатие по типам файлов и тп). Как после них проверить работоспособность, как вернуть в билд излишне минифицированное. Когда цель поместиться в 20 МБ, приходится выгребать крохи из всех углов. Вот это был бы полезный и показательный материал.


  1. LexxB
    25.12.2022 07:42

    Позволю написать пару комментариев:

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

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

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

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

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

    При старте проекта нужно сразу определиться с бекендом, для этого нужно знать ограничения и нюансы каждого (например, сборка arm64 возможна только с IL2CPP).

    Использование разных бекендов на разных стадиях проекта может привести к большим проблемам совместимости, некоторые плагины просто не будут работать при сборке с IL2CPP, хотя прекрасно все было у Mono