Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Оптимизация размера билда в Unity: практический опыт
На прошлом проекте (мобильная гипер-казуальная игра) мы уменьшили размер финального APK с 217 МБ до 89 МБ (снижение на ~59%) за счет комплексного подхода. Основные стратегии:
Анализ и профилирование
Сначала мы использовали Unity Build Report Tool и анализировали Android APK Analyzer, чтобы определить основные "пожиратели" размера:
<!-- Пример структуры анализа через Unity Editor -->
Assets/Textures: 78 МБ (36%)
Assets/Audio: 52 МБ (24%)
Assets/Animations: 31 МБ (14%)
StreamingAssets: 28 МБ (13%)
Managed Code: 18 МБ (8%)
Other: 10 МБ (5%)
Оптимизация текстур
Текстуры составляли самую большую категорию, поэтому мы предприняли:
- Конвертация всех UI-текстур в формат ASTC 6x6 (для Android) и ASTC 4x4 (для iOS)
- Использование Texture2DArray для похожих материалов (например, скины персонажей)
- Реализация динамической подгрузки текстур через Addressables для контента, не требующегося на старте
- Уменьшение максимального размера спрайтов с 2048x2048 до 1024x1024 где это было визуально приемлемо
// Пример настройки импорта текстур через Editor Script
[MenuItem("Assets/Optimize Textures")]
static void OptimizeSelectedTextures()
{
foreach (var obj in Selection.objects)
{
var path = AssetDatabase.GetAssetPath(obj);
var importer = AssetImporter.GetAtPath(path) as TextureImporter;
if (importer != null)
{
importer.maxTextureSize = 1024;
importer.textureCompression = TextureImporterCompression.Compressed;
importer.crunchedCompression = true;
importer.compressionQuality = 50;
AssetDatabase.ImportAsset(path);
}
}
}
Аудио компрессия
Аудиофайлы оптимизировали агрессивно:
- Конвертировали все WAV в OGG/Vorbis с качеством 0.7
- Для фоновой музыки использовали потоковую загрузку (LoadType: Streaming)
- Удалили неиспользуемые дубликаты звуков через AssetBundle Browser
- Настроили частоту дискретизации 22050 Гц для звуков окружения
Управление зависимостями и кодом
- Удалили неиспользуемые плагины и SDK (Firebase Analytics остался, но в минимальной конфигурации)
- Использовали IL2CPP с код-стерайпингом (Managed Stripping Level: High)
- Настроили разделение на базовый и контентный AssetBundles:
- Base (~15 МБ): ядро игры, основные механики
- Content (~74 МБ): уровни, персонажи, локации (подгружаются по требованию)
Архитектурные изменения
- Перешли на Addressable Assets System для динамической загрузки
- Реализовали прогрессивную загрузку контента (первые 3 уровня в базовом билде, остальные - по мере прохождения)
- Использовали Runtime Asset Bundles для локализационных данных
Дополнительные техники
- Сжатие Animation Clips через оптимизацию ключевых кадров
- Уменьшение полигональности 3D-моделей для LOD-версий
- Исключение ненужных данных из префабов (пустые скрипты, deprecated компоненты)
- Использование спрайт-атласов для UI элементов
Результаты
После внедрения всех оптимизаций:
- Initial APK: 89 МБ (против 217 МБ)
- Первое впечатление пользователя улучшилось (быстрая установка)
- Коэффициент установок увеличился на 23% (по данным магазинов)
- Потребление памяти в runtime снизилось на ~18%
Ключевой инсайт: оптимизация размера билда — это не разовая акция, а процесс, интегрированный в конвейер разработки. Мы внедрили автоматические проверки в CI/CD, которые отслеживают рост размера артефактов и предупреждают команду о превышении лимитов.