📦 Memory Profiler - инструмент, который спасёт вашу игру от утечек памятиПривет! Продолжаем тему оптимизаций и профилирования и сегодня разберём один из самых полезных инструментов в Unity - Memory Profiler.
Если у вас рандомные вылеты на мобилках, фризы при загрузке сцен или игра стабильно жрёт много RAM - этот инструмент вам поможет исправить ситуацию.
Что такое Memory Profiler и зачем он нуженMemory Profiler - это пакет от Unity для анализа использования памяти. Он помогает:
• Видеть, что именно занимает RAM
• Отлавливать утечки
• Находить лишние текстуры, Mesh’и, аудио, коллекции
• Находить ассеты, которые не выгружаются
• Сравнивать состояние памяти в разные моменты игры
Как пользоваться Memory ProfilerСначала установи пакет (на новых версиях Unity вшит по дефолту): Window → Package Manager → Memory Profiler → Install.
Открой: Window → Analysis → Memory Profiler.
1️⃣ Собери приложение на target устройствоУ этого профайлера такого же сайд эффект, как у обычного - в Editor режиме будет профайлить сам себя.
Поэтому, собираем приложение на устройство.
2️⃣ Сделай срез памяти (snapshot)Snapshot - фиксация текущего состояния памяти.
Snapshot хранятся на диске и их можно сравнивать между собой.
3️⃣Изучи информацию, используя разные режимы в SnapshotMemory Profiler даёт несколько разных представлений памяти. Это ключ к тому, чтобы быстро понять, где проблема.
1. Summary (Обзор)Самая верхнеуровневая картина. Сразу видно:
• Общий объём памяти
• Самые тяжёлые категории (Textures, Meshes, Audio, GC Heap)
• В каких областях память растёт
Это то, что открываешь первым, чтобы понять масштаб беды.
Здесь сразу можно увидеть "тяжёлые" ассеты и добавить им сжатия.
2. Objects and AllocationsПоказывает объекты Unity (Texture2D, Mesh, AudioClip, GameObject, ScriptableObject) и чистые C# объекты.
Здесь обычно ищут:
• дубли текстур
• Mesh’и с Read/Write
• «вечные» ScriptableObject
• коллекции, которые растут без очистки
3. Native MemoryПамять движка и нативных структур: Shader, ComputeBuffer, RenderTexture и т.д.
Именно здесь чаще всего «утекают»:
• RenderTexture
• Shader Variant Collection
• Compute буферы
• GPU ресурсы, которые не освобождаются
4. Managed Objects (GC Heap)Память .NET среды.
Тут можно найти:
• Списки, которые растут
• Dictionary, которые не чистят
• Объекты, удерживаемые статическими ссылками
• Лямбды, оставшиеся в событиях
4️⃣ Проведи оптимизацииУвидел "тяжёлые" ассеты в проекте - добавь им сжатия
Обнаружил дубляж ассетов - проверяй их загрузку/выгрузку
Просто смотри что жрёт больше всего памяти и найди способы оптимизации веса таких объектов.
5️⃣ Сделай новый Snapshot и используй сравнение (Diff)Diff - один из самых полезных режимов.
Сразу видно:
• улучшения памяти в сравнении с предыдущим snapshot
• что новое появилось в памяти
• какие ассеты загружаются повторно
• какой тип объектов растёт быстрее всего
Совет - куда обращать внимание, что чаще всего жрёт память• Текстуры - особенно UI, PNG без компрессии, включённые Read/Write (часто у Азиатских шрифтов TMPro)
• AudioClip - оставленные в RAM WAV-ки
• Meshes - включённый Read/Write Enabled
• Addressables - загрузили, но не выгрузили
• Коллекции - растут и никто не чистит
🚀
Пост Guru Unity: @Minerope