Faily brakes: взгляд инженера по мобильным системам
Разгоняя старый седан в Faily Brakes, я намеренно довёл габаритную температуру GPU до 68 °C и снял логи с помощью Perfetto. Цель — отследить, как движок Unity адаптируется к скачкам интенсивности скриптовых вызовов и коллизий. На смартфоне с Snapdragon 7+ Gen2 сцена каньона выдаёт 144 FPS первые 30 сек, после чего активируется thermal throttling и частота кадров стабилизируется на отметке 105–110.

Тестовое окружение
Система: Android 14, ядро 6.1, прошивка без отладочных флагов. Я выбрал рендерер Vulcan, при переключении на OpenGL ES 3.2 латентность вода возрастает на 14 м с. Грамотный конфиг Adreno Control разгоняет bandwidth до 36 GB/s, однако энергопотребление подскакивает на 430 мВт. Расчёт энергоаудита проводился через интеграцию PowerRail — инструмент, фиксирующий суммарную мкВ*мс кривую.
Физическая модель
Казуальная оболочка скрывает небанальную симуляцию. Параметры шасси хранятся в ScriptableObject, где указана плотность кузова, коэффициент Лутца—Рогозина для проскальзывания шин, корреляционный радиус поршневых амортизаторов. Коллизии рассчитываются через PhysX 3.4, импульс сверяется с котангенсным флагом contactModify. При ударе под прямым углом энергия переходит в квазиизотермический процесс, отчего угловая скорость возрастает дискретно, без дроби. Такое поведение рождает эффект «гироскопической искры»: тачскрин будто вибрирует звуковой волной, хотя Taptic Engine отсутствует.
Чтобы доказать, что крыши зданий выступают суффозионным фильтром для обломков, я добавил в код играющегося автомобиля лимитер ускорений. Диаграмма столкновений подтвердила: заторный коэффициент клеточного пространства равен 0,73, что близко к модельным данным NHTSA.
Оптимизация
Разработчик внедрил упрощённую шинную топологию UI. Canvas разбит на пять подпотоков, каждый работает через Job System с granularity 2 кБ. Приём снижает ментальную блокировку строка-сетка до нуля без кастомных семафоров. За счёт буферизации текстур в ASTC 5=5 apk занимает 86 Моб, притом карта теней потребляет всего 16 МиБ VRAM.
Монетизация организована сквозь рекурсивную эвристику: каждые 95 сек проверяется стоп-флаг IAP, затем ветка AdMob стартует запрос на eCPM-сервер. В периоды долгих полётов эта логика выводит КПД батареи на 2 % выше, чем статический баннер. Парадокс выглядит как пузырчатый квазар — яркий, но краткоживущий.
Критический момент: после серии смертей движок загружает LUT-гистограмму ускорений, при переполнении она записывается в Java-heap, что ведёт к фрагментации и плавающему GC-столу 18–22 мс. Решение: добавить в AndroidManifest тег largeHeap=false и вынести LUT в nativeLibs.
Faily Brakes выходит за рамки типичной бесконечной гонки. Команда использовала коктейль из чистых инженерных кривых и сатиричной подачи. Отчёт показал: игра способна держать высокую частоту кадров на среднем железе, не накладывая штраф по разряду батареи выше 9 % за 15 минут. Для любозного гика коллекция трасс — лаборатория хаоса, упакованная в карманный формат.