После того, как вы разберетесь с управлением памятью в Android и настроите инструменты для измерения использования памяти вашей игрой, следующим шагом будет активное сокращение и оптимизация этого процесса. Соблюдение строгих ограничений Android помогает предотвратить закрытие игры системой, сокращает время запуска и обеспечивает корректную работу игры на всех устройствах.
В этом руководстве представлены практические методы по сокращению потребления памяти вашей игрой, с особым акцентом на оптимизацию на уровне ресурсов, конфигурации, специфичные для движка, и лучшие практики управления памятью.
Сокращение потребления памяти в Unity
Из-за архитектурных особенностей Unity, после расширения собственных блочных распределителей и управляемой кучи, движок, как правило, сохраняет эти страницы памяти для повторного использования, а не немедленно возвращает их операционной системе (ОС), даже после освобождения ресурсов. В частности, виртуальное адресное пространство (зарезервированная память) остается зарезервированным на протяжении всего времени работы процесса, а физическая память (RSS) не освобождается сразу, пока не произойдет несколько циклов сборки мусора (GC) и обрезки. Следовательно, временный пик использования памяти может привести к тому, что резидентная память останется раздутой в течение длительного времени даже после снижения фактического использования. Такое поведение увеличивает риск сбоев из-за нехватки памяти (OOM) на устройствах низкого класса и ухудшает общую стабильность во время выполнения.
Следовательно, оптимизация памяти в Unity должна осуществляться с помощью трех основных подходов, адаптированных к особенностям работы движка:
- Контролируйте активное использование памяти, чтобы предотвратить пиковые нагрузки на память.
- Управляйте форматами текстур и вариантами шейдеров, чтобы избежать создания ненужных ресурсов и собственных ресурсов.
- Необходимо провести рефакторинг структуры кода во время выполнения, чтобы исключить ненужные выделения памяти в управляемой куче и минимизировать частоту сборки мусора и расширение кучи.
Для получения более подробной информации см. раздел «Оптимизация памяти в Unity» .
Многопроцессная оптимизация
Использование памяти кэшированными процессами не учитывается при расчете лимитов памяти, поскольку не влияет на активные приложения. Запуск службы в отдельном изолированном процессе помогает основному процессу как можно быстрее перейти в кэшированное состояние, тем самым улучшая работоспособность вашей игры.
Для получения дополнительной информации см. разделы «Как отслеживать состояние процесса и память» , «Как изолировать процесс службы с помощью Unity» и «Как изолировать процесс службы с помощью Unreal» .