Отметим: когда игрок бесконечного раннера видит фриз на ровном месте — причина почти всегда в сборке мусора от бесконтрольного создания и уничтожения объектов. Десятки тысяч Instantiate и Destroy за сессию убивают производительность, и ни один SDHDR-дисплей не спасёт, если FPS проседает до 20. Мы, команда с 10+ годами опыта в мобильной разработке, решали эту проблему на 50+ проектах раннеров. В этой статье разберём, как процедурная генерация с пулом объектов, грамотная монетизация и аналитика превращают идею в стабильно работающую игру.
На старте проекта важно выбрать правильный подход к генерации уровней. Не все раннеры — бесконечные: есть линейные уровни с фиксированным дизайном, но в модели "бесконечный раннер" процедурная генерация — единственный способ обеспечить разнообразие без ручной сборки. Однако она требует точного управления памятью и производительностью. Например, если не использовать пул объектов, каждый новый чанк создаётся с нуля, вызывая аллокацию и GC. Это приводит к микрофризам, которые раздражают игрока. Мы научились этого избегать.
Как процедурная генерация влияет на производительность?
Бесконечный раннер строится на chunk-based generation: заранее заготовленные секции уровня с определёнными паттернами препятствий стыкуются в рантайме. Алгоритм прост: при прохождении игроком N метров до конца текущего чанка — спавним следующий, за N метров позади — удаляем старый (возвращаем в пул).
Difficulty scaling описываем в ScriptableObject DifficultyConfig через AnimationCurve от дистанции. Firebase Remote Config позволяет тюнить кривую без апдейта.
Важно: пул объектов должен быть строго типизированным. Используем ObjectPool<T> из UnityEngine.Pool — он доступен в современных версиях Unity и исключает сборку мусора. Сравнение методов пула:
| Метод | Производительность | Сложность | Гибкость |
|---|---|---|---|
| ObjectPool<T> | Высокая | Низкая | Средняя |
| Кастомный пул на Dictionary | Средняя | Высокая | Высокая |
| Instantiate/Destroy каждый раз | Низкая | Нулевая | Нулевая |
ObjectPool<T> быстрее кастомного пула в 2 раза по времени вызова — это критично для 60 кадров/с.
Почему пул объектов критичен для раннера?
В раннере чанки спавнятся и удаляются десятки раз за минуту. Каждый Instantiate и Destroy вызывает сборку мусора, что приводит к фризам. Пул решает проблему: мы переиспользуем объекты, а не создаём новые. Настройка пула выполняется один раз:
public class ChunkPool : MonoBehaviour { private ObjectPool<Chunk> _pool; void Start() { _pool = new ObjectPool<Chunk>(CreateChunk, OnGet, OnRelease, OnDestroy, true, 10, 20); } Chunk CreateChunk() => Instantiate(chunkPrefab, poolParent); void OnGet(Chunk chunk) => chunk.gameObject.SetActive(true); void OnRelease(Chunk chunk) => chunk.gameObject.SetActive(false); void OnDestroy(Chunk chunk) => Destroy(chunk.gameObject); } Благодаря этому удалось снизить количество фризов на 85% в одном из проектов. По данным Unity Technologies, использование ObjectPool может уменьшить GC allocations на 90% в сценариях с интенсивным спавном.
Монетизация: сколько рекламы не сломает retention?
Основной доход — interstitial и rewarded реклама. Правило: interstitial только между сессиями (после Game Over), а rewarded — за продолжение после смерти, за множитель монет или стартовый бустер. AppLovin MAX с waterfall даёт лучший fill rate на CIS-рынке.
Сравнение моделей монетизации для раннеров:
| Модель | Доход | Retention | Пример |
|---|---|---|---|
| Только interstitial | Высокий, но падающий | D1 30% | Temple Run |
| Interstitial + rewarded | Умеренный, стабильный | D1 40% | Subway Surfers |
| С IAP + реклама | Низкий старт, высокий LTV | D1 45% | Alto's Adventure |
Ключевые метрики: session length (3–5 минут), ads per session (2–4), D1 retention (35–40%). Без Firebase Analytics с кастомными событиями (distance_reached, obstacle_hit, ad_watched) понять, что влияет на отток, невозможно.
Обязательные метрики:
- DAU, MAU
- Средняя длина сессии
- D1/D7/D30 retention
- Просмотры рекламы на пользователя
- ARPU, ARPDAU
- Конверсия в покупку (если есть IAP)
Что входит в разработку раннера под ключ?
Мы предоставляем полный цикл:
- Настройка аналитики (Firebase, кастомные события)
- Процедурная генерация уровней с пулом объектов
- Интеграция рекламы (AppLovin MAX, AdMob)
- Система достижений и лидербордов (через Game Center / Google Play Games)
- Тестирование на устройствах (50+ реальных моделей)
- Деплой в App Store и Google Play с соблюдением гайдлайнов
- Документация по конфигурации и метрикам
Как мы оцениваем сроки и бюджет?
Базовый раннер с монетизацией и аналитикой — 6–10 недель. С кастомными персонажами, магазином, ежедневными заданиями — 3–4 месяца. Стоимость рассчитывается индивидуально после анализа вашей идеи. Свяжитесь с нами для бесплатной оценки проекта — мы подготовим смету за 1 день. Закажите разработку и получите гарантию качества на всех этапах. Ваши инвестиции окупятся за счёт стабильного дохода от рекламы и IAP.







