×

Pokemon go: инженерный взгляд ar-песочницы

Пятисотмиллионный загрузочный счётчик Pokemon Go одинаково впечатлил инвесторов и телеметрию моих тестовых устройств. Я включил трассировку системных вызовов на Pixel 5 и увидел плотный поток UDP-пакетов к эндпоинту с TLS 1.3, обёрнутых в QUIC. Стек ощутимо отличается от классической http/2-модели, что снижает handshake до поры RT и неплохо чувствуется в полевых условиях, когда смартфон цепляет край соты.

На клиенте движок Unity подключён к проприетарному слою Niantic Lightship AR. Рендер проходит через Vulcan с мультипоточной компоновкой командных буферов. Ландшафт собирается из векторных тайлов Mapbox, упакованных в бинарный формат .mvt, ширина тайла — 512 пикселей, что уменьшает частоту doze-пробуждений при панорамировании.

Актуальные алгоритмы отслеживания

Сама ходьба рассчитывается симбиозом GNSS, стохастического дед-реконинга и сканирования Wi-Fi SSID. Kalman-фильтр сглаживает «дрожь» координат: вес процесс-шума ±5 м/с², измерительные ковариации формируются из CN₀ спутников. В подвалах игра падает на inertial navigation c Madgwick-кватернионами, разгон акселерометра выше 2 g автоматически переводит аватар в режим «passenger», отсекая спуфинг на электросамокатах.

Феномен «трёхступенчатой вибрации» основан на API — Vibrator.vibrate(pattern, attributes) — где pattern = {0, 60, 100, 60, 100, 180}. Уровень вибрации кодирует ранг покемона, что снижает необходимость частых взглядов на экран и экономит OLED-энергию полосой в ≈160 мВт.

Тонкости энергопотребления

Profiler показывает главный прожорливый узел — постоянное удержание wakelock PARTIAL_WAKE. При 120 Гц дисплея потребление вырастает на 18 %. Переключение на динамические частоты через SurfaceFlinger:setFrameRate(60, SEAMLESS) спасает ещё 230 мВт. Сигнализация push-эвентов переехала на Firebase Cloud Messaging, длительность приёма — 250 мкс, что укладывается в DRX-тайм-аут LTE-Cat 12.

Сетевая задержка редко превышает 80 мс КЕЕ благодаря локальному PoP на базе Google Edge Point. При отсутствии такого узла сервер применяет бинарный протокол ProtoBuf, чтобы уменьшить payload рейдов до ≈900 байт и держать jitter под порогом 25 мс, пока игрок бросает ультрабол.

Для расчёта видимости покемонов сервер отдаёт список s2-ячейки уровня 15. Это икосаэдрическая проекция, делящая земной шар на ~1,3 млрд полигонов, каждый шириной c квартал. Смена уровня ячейки-детализации выполняется HILTI-алгоритмом — геодезической интерполяцией с матрицей H из сферических гармоник четвёртого порядка.

Прогноз развития AR

ARCore Depth API уже подхватывает occlusion-маски, так что Пикачу прячется за лавочкой без ручного отсечения. Niantic планирует вплести VBS (Visual Positioning System) поверх SLAM: точки-маяки из облака точек накрывают города, подобно созвездиям Стрейнджа, позволяя мне запускать опыт с точностью до 5 см без GPS.

В долгом цикле я жду смещения вычислений на промежуточный слой Mobile Edge Compute с кастомной нейронкой RNN-T для распознавания жестов trainer’а. TensorFlow Lite миксуется с GPU delegate, при fp16 сборка весит 12,4 МБ, что не пугает хранилище.

Вместо эпилога: Pokemon Go показал, что симбиоз сетевого транспорта нового поколения, экономного рендеринга и геймификации маршрутов способен превратить карту планеты в игровое поле. Для мобильных инженеров продукт служит полигоном, где инновации проходят проверку на миллиардах минут экранного времени.