Pokemon go завоевывает мир: технический взгляд изнутри
С июля 2016 года хронокарта городов украсилась разноцветными скоплениями игроков, державших смартфоны высоко, будто линзы вперёд. Я, инженер по мобильным системам, наблюдал сцену через собственный набор инструментов: анализ сетевых пакетов, журнал вольт-амперных характеристик батарей, статистику API вызовов. Игра Pokemon Go выдвинула на передний план дополнённую реальность (AR), но важнее — соединила AR с геймифицированной картографией на базе платформы Niantic Real World.
Линзы дополнённой реальности
Ключевым узлом выступает движок Lightship, применяющий SLAM (simultaneous localization and mapping — одновременная локализация и построение карты) для привязки виртуальных объектов к GPS-координатам и счётчику инерциальных датчиков. Алгоритм выдаёт позицию с задержкой порядка 50–90 мс, чего хватает, чтобы карманный монстр стоял воспринимаемо устойчиво даже при шаговой вибрации рук. Для уменьшения джиттера разработчики добавили пространственный low-pass-фильтр со скользящим окном в 5 кадров.
Большинство смартфонов средней ценовой категории выполняют визуализацию через OpenGL ES 3.2, в то время как флагманы перешли на Vulkan, экономя до 18 % энергии за счёт снижения драйверных переключений контекста. Для камер используется прямой доступ к YUV-потоку через Image Reader, обходящий лишнюю конвертацию в RGB. На моих тестовых устройствах Snapdragon 888 держит 60 fps при 1080p, а Dimensity 9200 удерживает 90 fps при той же сцене. Разница объясняется тем, что MediaTek активировал фамильный модуль Imagic IQ ISP, ускоряющий edge-enhancement.
Сетевой трафик и кэш
Основной трафик формируетсяют вызовы rpc поверх HTTP/2. Пакеты рассылаются каждые 5 секунд, объём колеблется вокруг 6 кБ. Геочанки карт берутся c CDN, построенного на Google Cloud Edge с опцией smart-prefetch: клиент заблаговременно выгружает тайлы вокруг прогнозной траектории, вычисленной Kalman-фильтром по ускорению шага. За счёт такой догрузки вероятность пустого экрана падает до 1,3 %. При плохом соединении вступает в игру файл-кэш LRU 256 МБ, скрытый в каталоге /data/data/com.nianticlabs.pokemongo/cache.
Питание остаётся больной темой. Радиово мн всегда голодно, а высокочастотная работа CPU-GPU греет кремний до 42 °C. Для продления сеанса использую комбинированную схему: ядра Efficiency удерживаются на 1,2 ГГц через schedutil-governor, яркость ограничена до 350 нит, а технологический приём TRRS (thermal run-rate smoothing) распределяет задачи между кластерами. Тест показал 212 минут игрового времени на аккумуляторе 4500 мА·ч вместо базовых 137.
Будущее Pocket-универсальный
Niantic анонсировал модель пространственного анкеринга VPS 2.0: камера формирует облако точек, сжимаемое алгоритмом Octree-Entropy, и через секунду сервер отвечает глобальным идентификатором. Данные открывают путь к мультиартым взаимодействиям. Воображение подсказывает мероприятия, где десятки тренеров видят одного титана, а уровень интерактивности регулируется сигнальным коэффициентом ISR (stream-interaction rate). Коммерческий потенциал тоже впечатляет: торговым центрам достаточно встроить пару трёхдиапазонных beacons, чтобы привлечь трафик ног. При этом приватность соблюдается: гео-хэши передаются с шагом 6 бит.
Наблюдая за тиражированием технологии, ловлю отголоски детского восторга, но на равных идёт хладнокровный инженерный расчёт. Когда литий-полимерные батареи получат плотность 450 Вт·ч/кг, а сетевые ядра 5,5G снизят задержку до 5 мс, карманная реальность полностью сольётся с физической улицей. Впрочем, главный ресурс — желание ходить ногами, Niantic аккуратно встроил его в алгоритмы прогресса, и именно поэтому игрок готов идти к следующему покестопу даже под вечерним дождём.