Разработка мобильной 3D-игры: где ломается прототип
Прототип мобильной 3D-игры почти всегда собирается на одном устройстве — рабочем, где всё ровно: сцена грузится, кадры идут, эффекты на месте. На устройствах заказчика и в реальной выборке игроков картина другая: просадки плавности на массовых сценах, вылеты при переключении между экранами и уровнями, загрузка уровня, во время которой пользователь успевает свернуть приложение. Формально игра готова, фактически — до неё не доходит половина установивших.
Причина почти всегда одна и та же — архитектура загрузки и памяти, а не графика. Ресурсы уровня поднимаются одним куском и висят в памяти до выхода, хотя половина нужна только на первых секундах. Объекты за пределами видимости продолжают обсчитываться физикой. Шейдеры собираются в момент первого показа эффекта, поэтому рывок приходится ровно на самый впечатляющий момент боя. Сборщик мусора срабатывает в пике, когда в кадре максимум персонажей.
Узкое место проекта определяется не на стенде разработчика, а на слабом устройстве: там ограничен и объём памяти, и число объектов, которые можно отрисовать за кадр. Найти его без замеров нельзя, и команда начинает править визуал — резать эффекты, упрощать модели, теряя то, за что игру выбрали. При этом настоящий виновник остаётся нетронутым: сцены не разбиты на загружаемые части, а у каждого персонажа своя копия материала, из-за чего отрисовка дробится на мелкие вызовы.
Цена такой ошибки — отвалившиеся при первом запуске, возвраты и переделка загрузки уже после релиза, когда менять структуру сцен дороже всего. Дальше разбираем, как это закрывается: от разбиения контента на загружаемые блоки до замеров и профилей под конкретные классы устройств.
Что даёт управляемый игровой цикл и оптимизация сцен
Игровой цикл — это порядок, в котором кадр проходит ввод, симуляцию, анимацию и отрисовку. Пока ввод и физика обновляются в том же такте, что и отрисовка, плавность анимации проваливается на слабом устройстве: короткая просадка частоты кадров ломает и управление, и попадание в цель. Мы разводим такты — симуляция идёт с фиксированным шагом, отрисовка интерполирует состояние, поэтому поведение игры не зависит от того, сколько кадров успело устройство.
Оптимизация сцен начинается с того, что уровень перестаёт быть одним монолитом. Загрузочная сцена, игровые зоны и элементы интерфейса подгружаются аддитивно и выгружаются, когда перестают быть нужны. Время загрузки уровня сокращается в разы: в память попадает только то, что игрок увидит в ближайшие секунды, а не весь контент игры сразу.
На размер сборки работает та же логика. Общие материалы и текстуры собираются в атласы, дубли ресурсов вырезаются, тяжёлый контент разносится по наборам под разные классы устройств. Сборка перестаёт расти с каждым новым уровнем, а установка и обновление занимают у игрока заметно меньше времени — часть аудитории отваливается именно на этом шаге.
Отдельный эффект — уход класса отказов «вылет при переходе между сценами». Он возникает, когда объекты и ссылки живут дольше своей сцены. Мы фиксируем контракт: сцена владеет своими ресурсами, освобождение памяти детерминировано, а замеры на каждом переходе входят в регламент проверок перед публикацией. Движок вроде Unity даёт для этого инструменты, но порядок задаёт архитектура, а не инструмент.
Варианты реализации 3D-проекта: движок, гибрид, сборка
Режим реализации выбирают не по вкусу, а по тому, где в продукте проходит граница между трёхмерной сценой и остальной логикой. Если интерфейс, каталог, аккаунт и платежи живут вне сцены, их дешевле держать отдельно и подключать 3D как встраиваемый слой, а не собирать весь продукт внутри игрового движка.
Разница особенно заметна на слабых устройствах и в долгой поддержке: нативная графика даёт максимум контроля над частотой кадров и памятью, но требует отдельной кодовой базы под каждую платформу. Ниже — четыре режима, между которыми реально выбирают.
| Вариант | Когда подходит | Ограничения |
|---|---|---|
| Полный цикл на игровом движке | Продукт целиком про сцену: уровни, физика, эффекты, много контента | Вес сборки и требования к устройству выше; интерфейс собирается средствами движка |
| Гибрид: нативный интерфейс и встраиваемая 3D-сцена | Трёхмерная часть сочетается с сильными экранами вне сцены | Сложнее обмен данными между слоями, нужна синхронизация состояний и отладка на стыке |
| Нативная графика под каждую платформу | Нужен максимум контроля над кадрами, памятью и загрузкой ресурсов | Две кодовые базы, дороже и дольше поддержка, общие модули дублируются |
| Лёгкий кроссплатформенный слой отрисовки | Простые сцены и широкая аудитория, включая старые устройства | Потолок по эффектам и материалам: часть графики приходится упрощать |
Выбор фиксируем на прототипе: одна сцена собирается в двух режимах, снимаем замеры — время загрузки, частоту кадров на слабом устройстве, объём сборки. Дальше решение принимается по цифрам, а не по обещаниям.
Этапы работы над проектом: от аудита до передачи
Инженерная последовательность важнее скорости: правка графики на середине пути перекраивает схему сцен и откатывает уже принятые решения. Поэтому порядок работ фиксируем до старта, а каждый этап закрываем измеримым результатом — что проверено, на каком парке устройств и с каким запасом.
- Аудит прототипа. Разбираем, что уже собрано: как устроены сцены, где проседает кадровый ритм, что удерживает память. На выходе — список узких мест с приоритетом.
- Схема проекта. Раскладываем структуру сцен, реестр ресурсов и правила именования так, чтобы уровень догружался частями и не тянул за собой весь контент.
- Настройка графики. Задаём уровни качества: что отключаем на слабых устройствах, какой свет считаем заранее, а какой — в реальном времени.
- Приёмка на устройствах. Проверяем не в редакторе, а на реальном парке: слабые модели, средний сегмент, свежие аппараты. Смотрим кадровый ритм, нагрев, память и время запуска уровня.
- Оптимизация по замерам. Правим только то, что подтвердилось цифрами: атласы текстур, число объектов на сцене, частоту обновления логики. После каждой правки — повторный прогон.
- Передача проекта. Отдаём хранилище кода с историей, инструкцию по сборке, профили качества, доступы к магазинам приложений — и обучаем команду заказчика выпускать релиз самостоятельно.
Передача — не формальность, а точка, после которой проект живёт без нас. При необходимости остаёмся на сопровождении: следим за метриками выпущенных сборок и подключаемся к правкам.
Что остаётся у заказчика: сборки, схемы и регламенты
Передача проекта — это не архив файлов и не папка, которую соберёт только автор. Мы оформляем репозиторий, правила сборки и документацию так, чтобы сторонняя команда выпустила обновление и откатила его без переписки с нами.
- Исходники в репозитории заказчика. Полная история изменений, ветки под задачи и метки релизов; доступ у владельца проекта, а не у нас.
- Схемы сцен и структура проекта. Карта уровней, связей модулей и настроек графики под разные классы устройств.
- Правила сборки. Скрипты и инструкция: как воспроизвести окружение с нуля и какие ключи подписи нужны под каждую платформу.
- Регламент выпуска и отката. Порядок подготовки версии, проверки перед публикацией и шаги возврата к предыдущей версии.
- Документация. Описание модулей, схемы данных, точки подключения аналитики, платежей и рекламных сетей, журнал известных ограничений.
- Доступы и права на материалы. Публикационные кабинеты, сертификаты подписи и лицензии на модели, текстуры, звук и шрифты с подтверждением коммерческого использования.
Каждый пункт проверяем на приёмке: если сборка не воспроизводится на чистой машине по инструкции, работа не считается сданной.
Кейс: как убрали вылеты при переключении сцен
Проект — казуальная 3D-гонка на Unity с десятью трассами и переключением сцен между заездом и меню. На устройствах нижнего ценового сегмента при возврате в меню приложение закрывалось: доля таких сессий доходила до 7%, а в отзывах повторялось «вылетает после гонки». На флагманах проблема не воспроизводилась, поэтому её списывали на слабое железо и откладывали.
Диагностика показала другое: новая сцена грузилась до выгрузки старой, пик потребления памяти упирался в лимит системы, и процесс снимался принудительно. Мы перевели переходы на асинхронную загрузку с явным освобождением ресурсов, разбили тяжёлые текстуры и звук на подгружаемые пакеты и добавили прогрев материалов ещё в меню. Объекты на трассе теперь берутся из пула, а не создаются заново на каждом круге.
| Метрика | До | После |
|---|---|---|
| Сессии с вылетом при переключении сцен | 7% | 0,4% |
| Время загрузки уровня | 6,2 с | 2,4 с |
| Сбои на устройствах нижнего сегмента | 18% запусков | менее 1% |
| Время до первого кадра после перехода | 3,1 с | 1,3 с |
Стабильность подтвердили на реальных устройствах, а не только в эмуляторе: прогнали по 200 переходов между сценами на каждой модели нижнего и среднего сегмента. По словам заказчика, поток обращений в поддержку по вылетам прекратился, оценка в магазине выросла с 3,8 до 4,5, а удержание после первой сессии — на треть.
Что делать, если есть прототип, но проект не масштабируется?
Прототип отвечает на один вопрос — интересно ли играть. Когда он это доказал, выясняется, что архитектура не рассчитана на контент: логика перемешана с отрисовкой, сцены собираются целиком, ресурсы лежат в исходном виде. Проект упирается в потолок — плавность проседает на новых уровнях, а каждая новая механика ломает две существующие.
Переиспользуется при этом больше, чем кажется. Математика управления, правила баланса, ощущение персонажа, схемы прогрессии — это результат десятков итераций, и его не переписывают, а выносят в отдельный слой, не зависящий от отрисовки. Вокруг него и строится рабочая версия.
Переписывается слой представления и работа с контентом. Рефакторинг графики — это не «сделать красивее», а разложить ресурсы по назначению: общие атласы, уровни детализации, подгрузка по мере движения игрока. Материалы и модели приводят к единым правилам, чтобы новые уровни добавлялись без правки кода.
Масштабирование проекта ведут пошагово, сохраняя играбельную сборку на каждом шаге. Сначала разделяют логику и отображение, затем переносят контент, потом настраивают сборку под разные классы устройств. Это и есть переработка без потерь: игра остаётся на экране, а не превращается в полугодовой котлован.
В итоге прототип и рабочая версия перестают быть разными проектами. Сроки не удваиваются, стоимость владения тоже: новые механики добавляются предсказуемо, а узкие места видны на замерах до того, как их заметит игрок.
Частые вопросы: интеграции, обновления, поддержка
Ниже — вопросы, которые чаще всего задают перед стартом и в первые месяцы после релиза. Они касаются не самой игры, а того, как проект живёт дальше: обновляется, стыкуется с внешними сервисами и что в итоге остаётся заказчику.
Что входит в поддержку после релиза?
Разбор отчётов о сбоях, выпуск исправлений, адаптация под новые версии операционных систем и требования магазинов приложений, включая Google Play. Сроки реакции на критические падения закрепляем регламентом, плановые правки идут спринтами.
Как выпускаются обновления игры?
Контент — уровни, баланс, события — выносим в серверные настройки и меняем без пересборки приложения. Новые механики и правки клиентской части выходят плановыми релизами, со совместимостью прошлых версий.
Как встраиваются оплата, аналитика, авторизация?
Каждый внешний сервис подключаем отдельным модулем с единым интерфейсом. Смена платёжного провайдера или системы аналитики не затрагивает игровую логику — правится только модуль интеграции.
Кому принадлежат права на исходники?
Заказчику. Передаём репозиторий с историей изменений, сборочные конфигурации, доступы к магазинам и серверной части, документацию по архитектуре — проект не остаётся привязанным к нам.
Можно ли передать проект другой команде?
Да. Код не зависит от наших внутренних сервисов, сборка воспроизводится по инструкции, передача занимает несколько дней вместе с разбором архитектуры и текущего состояния.
Обсудим задачу: вернёмся с оценкой и планом работ
Опишите задачу — жанр, референсы, целевые устройства и то, что для вас считается успехом. Мы вернёмся с оценкой проекта и планом работ: не с общим «сделаем за несколько месяцев», а с разбивкой по этапам, составом команды и точками приёмки, где результат видно в сборке, а не в презентации.
Разговор по делу занимает один созвон: уточняем игровой цикл, профиль нагрузки на сцене, требования к частоте кадров на слабых устройствах и ограничения площадок публикации. По итогам вы получаете:
- Состав команды: дизайнер механик, программист игровой логики, инженер по графике и производительности, 3D-художник, тестировщик — с ролями и загрузкой по этапам.
- Этапность: вертикальный срез одного уровня, затем производство контента, оптимизация и подготовка сборок к публикации.
- Точки приёмки: рабочая сборка на живом устройстве с профилированием — фиксируем, какую долю времени держим целевой порог кадров и сколько занимает загрузка сцены.
- Формат отчётности: сборки по расписанию, короткий список изменений и открытых рисков, доступ к трекеру задач с вашей стороны.
- План работ по срокам: длительность этапов, зависимости между ними и что может сдвинуть дату публикации.
- Что нужно от вас: решения по монетизации и целевым платформам, доступы к аккаунтам магазинов, референсы и приоритеты.
Такая оценка проекта опирается на объём контента и производительность, а не на догадки. Дальше фиксируем состав команды и первую точку приёмки, стартуем с вертикального среза: прототип попадает к вам в руки раньше, чем развернётся полное производство, и решения по механикам принимаются на работающей сборке, а не на словах.







