×

Msqrd для android: инженерный ракурс

Коллеги, предлагаю инженерный обзор Android-версии MSQRD, изученной мной с ранних pre-alpha сборок до текущего релиза. Речь пойдёт о топологии фильтров, тонкостях рендеринга и практических приёмах, продлевающих автономность без потери кадров.

MSQRD

Алгоритм захвата лица

В ядре — каскад из сверточной сети и жёсткой регрессии Procrustes alignment, создающей трёхмерный mesh из 468 вершин. Трекинг поддерживает sub-pixel дискретность, что снижает дрожание фильтра при угловых скоростях головы. Часть вычислений вынесена в нейроускоритель NAPI, при отсутствии такого блока включается fallback на CPU с SIMD-инструкциями NEON. Маска хранится как набор barycentric координат, благодаря чему текстурирование выполняется одной GLSL-ядро.

Производительность Android-устройств

GPU-профайлер Systrace показывает, что сцена генерирует два draw-call’а: подготовку off-screen FBO и комбинацию слоёв. Такое разделение сводит чрезмерные вызовы glBindTexture к минимуму. На чипах Adreno 6xx получение 30 FPS требует менее 18 мс на кадр, что вписывается в VSYNC-окно. Kirin-процессоры, лишённые полноценного ASTC-декодера, выигрывают от перекодировки ассетов в ETC2. Для энергоэффективности полезна динамическая смена частоты GPU через Hint API: при зевке фильтра частота отпускается, при анимации — поднимается.

Советы интеграции SDK

1. Загружайте *.mask-файлы через AAssetManager, избегая java.io, чтобы сократить GC-паузы.

2. Вызывайте setFrameDropThreshold(45) — параметр удерживает каденс, сбрасывая сверхтяжёлые кадры без заметного разрыва потока.

3. Для собственных эффектов используйте LUT 16×256 px и sRGB-профиль, иначе цветовое пространство сместится к magenta на дисплеях P3.

4. Трансляция шейдеров через glslangValidator с флагом –Os снижает вес apk, благодаря встроенной passes-секции spirv-opt.

Особые детали

Приложение хранит список фильтров в protobuf-контейнере, зашифрованном алгоритмом Chacha20-Poly1305, ключ кэшируется в KeyStore с фингерпринтом устройства. Такой подход предотвращает ре пакеты, хотя удлиняет холодный старт на ~90 мс. В коде встречается редкий термин «пенумбра-маска» — адаптивная зона размывания краёв, формирующая плавный переход между личным контуром и наложением. Значение вычисляется через convolution radius, равный 4 σ, где σ — стандартное отклонение гауссового ядра.

После приобретения MSQRD корпорацией Meta реализация постепенно мигрирует на Casual Games. Планируется векторная сегментация волос, что снизит шум в прядях и откроет путь к виртуальному окрашиванию в реальном времени.

Таким образом, даже на средних чипсетах бюджетных смартфонов лицевая аугментация уже сопоставима по качеству с десктопными решениями, при том что энергопотребление удерживается в разумных границах. Придерживаясь изложенных приёмов, разработчик получает устойчивый fps, чистый звук и довольного пользователя.