Minions Paradise™ Оптимизация мобильного Unity приложения Дмитрий Веденко, EA Saint Petersburg
Minions Paradise™
Оптимизация мобильного Unity приложения
Дмитрий Веденко, EA Saint Petersburg
Minions Paradise™• Жанр: City-builder
• Много 3D анимаций
• Много статической
геометрии
• Unity 4.6
• Runtime DI
• Выпуск на iOS и Android
Performance Issues• Регулярные подтормаживания на 100-150 миллисекунд
• Низкий FPS, например, 6-15 на Nexus 5
• Высокое потребление памяти
Lags and Freezes
Unity Profiler
GC занимает 101msКадр 170ms
GC вызывается каждые 30 кадров.
Garbage, Garbage, Garbage
Каждый кадр – более чем 25 Кб выделенной памятиПри 30 кадрах в секунду - более чем 750 Кб/сек
«Плохой» случай:120 Кб/кадр
235ms!
Garbage, Garbage, Garbage
Implicit Allocations
• Runtime DI– Очень много объектов
– Очень много ссылок
– System.Reflection
• Неявное выделение памяти в Unity– Value type boxing
– Types marshalling
A nightmare for any GC!
The Cure
• Тщательно профилируем performance critical код
– Используем value type где только возможно
– Избегаем boxing’а
– Избегаем reflection в динамике
– Переиспользуем коллекции и объекты
Результат: • Общее улучшение производительности• Анимации и движение камеры значительно плавнее
Not Good Enough
• CPU или GPU?
• Unity не позволяет профилировать GPU на мобильных устройствах
Android GPU Profilers
• Работает далеко не со всеми прошивками/устройствами
• Не самый популярный чип
• Широкий спектр возможностей• Не требует root
Android GPU Profilers
• Все меньше и меньше новых Android устройств
• Разделено на два приложения
Нужен ROOT
СPU or GPU?Итак, упираемся ли мы в GPU?
Не совсем
The Cure
• Упрощение анимаций
• Упрощение геометрии
• Упрощение коллизий
• Во многом art driven, несмотря на «упор» в CPU
Результат: • Повышение производительности до приемлемых
значений• Ускорение загрузки• Снижение нагрузки на память
Memory Footprint
Memory Usage
+ Хорошая оценка используемой памяти+ Разделение управляемой и неупраляемой куч
- Смешаны RAM and VRAM- Не совсем корректно работает с texture quality- Результат не совсем отражает реальную ситуацию
452Mb
Memory Usage
735Mb!
• Основной потребитель - ассеты
• Очень большой managed heap: 110Mb68.2Mb – свободно
Memory Breakdown
Texture Memory Usage
• Много неиспользуемых текстур• Дубликаты• Texture Quality не имеет эффекта
Unity Sprite Packer
• Sprite Packer не дружит с Asset Bundles,
в бандл попадут и атлас, и спрайт
• Не работает со спрайтами в ресурсах
• Серьезно замедляет старт Unity Editor
• Не имеет представления о структуре спрайтов
Texture Duplicates• «Нестандартное» использование Asset Bundles• Дубликаты возникают при перезагрузке Asset
Bundles• Загруженный Asset Bundle – оверхед на Android
The Cure
• Раннее планирование структуры и иерархии ресурсов
Sum Up
• Никогда не рано начинать оптимизацию
• Пользуйтесь профайлером в профилактических целях
• «Очевидное» решение не всегда верное
• Правильно подбирайте и используйте технологии