AR-приложение на ARKit греет iPhone 12 до 45°C за 8 минут сессии и разряжает батарею на 1% в минуту. Frame rate — 45–50 FPS вместо 60. Это не «немного тормозит» — это приложение, которым нельзя пользоваться. За 5 лет мы оптимизировали более 50 AR-проектов — от мебельных каталогов до промышленных визуализаций — и знаем, как выжать максимум из железа.
Оптимизация AR — особая дисциплина: нельзя пожертвовать качеством трекинга ради FPS, нельзя убрать освещение и потерять реализм, нужно работать одновременно с CPU (ARKit/ARCore обработка), GPU (рендеринг) и Neural Engine (если есть ML-модели). Мы гарантируем результат: стабильные 60 FPS и экономию батареи до 30%.
Почему AR-приложение греется и теряет FPS?
ARKit/ARCore работают непрерывно: захват кадра с камеры → feature detection → плоскостная оценка → обновление мировой модели → рендеринг. Каждый этап — вычислительная нагрузка. На iPhone ARKit использует Neural Engine для плоскостного трекинга, что сильно разгружает CPU/GPU. На Android ARCore — тяжелее для GPU на устройствах без NPU.
Типичные узкие места:
- Загрузка тяжёлых 3D-моделей в
ARSCNViewбез оптимизации:SCNNodeс 500K полигонов без LOD, текстуры 4096×4096 без mipmapping. GPU рендерит одинаково детально объект на переднем плане и в 10 метрах от камеры. - Включённые фичи трекинга, которые не используются.
ARWorldTrackingConfigurationсisAutoFocusEnabled = trueиenvironmentTexturing = .automaticбез реальной необходимости — постоянная нагрузка на систему. - Физика в
SCNSceneсSCNPhysicsBodyна каждом объекте при десятках AR-объектов — физический движок SceneKit не оптимизирован для мобильных AR-сцен с большим количеством тел.
Как мы оптимизируем ARKit: конфигурация сессии и рендеринг
Конфигурация сессии
let configuration = ARWorldTrackingConfiguration() // Включаем только то что реально нужно configuration.planeDetection = [.horizontal] // не .vertical если не нужно configuration.isAutoFocusEnabled = false // фиксированный фокус — меньше нагрузки configuration.environmentTexturing = .none // отключаем если нет PBR-материалов // Для простых сцен — lighter tracking let simpleConfig = AROrientationTrackingConfiguration() // только ориентация, без world tracking Для приложений где нужен только face tracking — ARFaceTrackingConfiguration вместо ARWorldTrackingConfiguration. Разница в нагрузке на CPU — ощутима.
Рендеринг через Metal вместо SceneKit
ARSCNView удобен, но для сложных сцен MTKView + кастомный Metal-рендерер даёт полный контроль над draw calls. SceneKit добавляет overhead на управление нодами и физику. С ARSession + MTKView:
func session(_ session: ARSession, didUpdate frame: ARFrame) { let commandBuffer = commandQueue.makeCommandBuffer()! // Рендерим captured image (камера) renderCapturedImage(frame.capturedImage, commandBuffer: commandBuffer) // Рендерим AR-контент renderVirtualContent(frame, commandBuffer: commandBuffer) commandBuffer.present(drawable) commandBuffer.commit() } Это даёт 20–30% прирост FPS на сценах с 10+ AR-объектами по сравнению с ARSCNView.
Culling и LOD
SCNNode.isHidden = true для объектов вне поля зрения — SceneKit не рендерит скрытые ноды, но выполняет physics и update. Правильно — убирать объекты из сцены: node.removeFromParentNode().
// Frustum culling вручную func shouldRenderNode(_ node: SCNNode, camera: ARCamera) -> Bool { let screenPoint = camera.projectPoint(node.worldPosition, orientation: .portrait, viewportSize: viewportSize) return screenPoint.x > -0.1 && screenPoint.x < 1.1 && screenPoint.y > -0.1 && screenPoint.y < 1.1 } Что делать с ARCore: сессия и рендеринг
Session config
val config = Config(session) config.planeFindingMode = Config.PlaneFindingMode.HORIZONTAL_ONLY config.lightEstimationMode = Config.LightEstimationMode.DISABLED // +15% battery config.depthMode = Config.DepthMode.DISABLED // если глубина не нужна session.configure(config) LightEstimationMode.ENVIRONMENTAL_HDR — самый дорогой режим, даёт реалистичные отражения. На устройствах без Depth API (большинство mid-range) использовать только если это ключевая фича.
Rendering через Filament
ARCore-приложения с Filament (Google's PBR renderer) рендерят PBR-материалы через Vulkan на поддерживаемых устройствах — заметно быстрее чем через OpenGL ES. Готовый пример — arcore-android-sdk samples с Filament-интеграцией.
Как добиться стабильных 60 FPS в AR?
Ключевые шаги:
- Отключить неиспользуемые функции трекинга (environmentTexturing, autoFocus, depth mode).
- Перейти на низкоуровневый рендеринг (Metal или Vulkan).
- Применить LOD и culling к 3D-моделям.
- Сжать текстуры (ASTC, ETC2).
| Параметр конфигурации | Влияние на производительность | Рекомендация |
|---|---|---|
| planeDetection | Среднее: поиск плоскостей нагружает CPU | Включать только нужные типы (horizontal/vertical) |
| environmentTexturing | Высокое: динамическое освещение через HDR | Отключать, если не используется PBR |
| depthMode | Высокое: обработка глубины (ARCore) | Отключать, если не нужна окклюзия |
| lightEstimationMode | Среднее-высокое: ENVIRONMENTAL_HDR самый дорогой | Использовать DISABLED или AMBIENT_INTENSITY |
| isAutoFocusEnabled | Низкое: автофокус камеры | Отключать для фиксированного фокуса |
Сравнение подходов ARKit vs ARCore
| Параметр | ARKit (iOS) | ARCore (Android) |
|---|---|---|
| Работа с трекингом | Использует Neural Engine для плоскостного трекинга — меньше нагрузка на CPU | Зависит от наличия Depth API; без него нагрузка на GPU выше |
| Основной рендеринг | Metal — низкоуровневый контроль, SceneKit — быстрое прототипирование | Vulkan (через Filament) или OpenGL ES |
| Рекомендуемый FPS | 60 FPS легко достижимы на iPhone 11+ после оптимизации | 30–60 FPS в зависимости от устройства |
| Типичные проблемы | Нагрев из-за высокой частоты кадров + трекинг | Фрагментация устройств, разная поддержка Depth API |
Кейс: AR мебельный каталог
Из нашей практики: клиент — приложение для просмотра мебели в AR. Диваны и столы — 3D-модели от дизайнеров, по 800K–1.2M полигонов каждый. На iPhone 13 — 24 FPS при размещении 2 объектов. Проблема очевидна.
Работа: экспорт моделей через Blender с decimation до 50K полигонов для AR-версии (потеря детализации незаметна с расстояния 1–2 метра на телефоне). Конвертация текстур из PNG 4096×4096 в ASTC 2048×2048. Добавление LOD: высокая детализация для объектов ближе 1.5 метра, средняя — дальше. Результат: 58–60 FPS стабильно, температура нормализовалась. Клиент сэкономил около $5 000 на доработках, избежав полного переписывания приложения.
Как проходит оптимизация: пошаговый процесс
- Аудит производительности — профилирование на реальных устройствах (iPhone 12, Pixel 6 и т.д.), замер FPS, температуры, расхода батареи. Фиксация baseline.
- Анализ и планирование — выявление узких мест, составление плана доработок с приоритетами.
- Доработка — оптимизация конфигурации сессии, рендеринга, 3D-моделей.
- Тестирование — повторное профилирование, сравнение с baseline, корректировка.
- Деплой и поддержка — внедрение изменений, консультации.
Что входит в работу по оптимизации AR-приложения
- Аудит производительности на целевых устройствах.
- Оптимизация конфигурации сессии (отключение ненужных фич, настройка параметров).
- Оптимизация рендеринга (переход на Metal/Filament, LOD, culling, сжатие текстур).
- Документация с отчётом и рекомендациями.
- Поддержка после внедрения.
Сроки и как начать
- Аудит производительности — 2–3 дня.
- Оптимизация рендеринга и конфигурации сессии — 1–2 недели.
- Если нужна оптимизация 3D-моделей — дополнительно, зависит от количества ассетов.
Стоимость оптимизации рассчитывается индивидуально, экономия бюджета может достигать 30%. Получите консультацию по оптимизации вашего AR-приложения — свяжитесь с нами для бесплатной оценки проекта. Закажите аудит производительности AR-приложения уже сегодня.
Типичные ошибки при оптимизации AR
- Пытаться оптимизировать рендеринг, не замерив baseline.
- Использовать максимальную конфигурацию трекинга для простых сцен.
- Забывать про LOD и mipmapping для 3D-моделей.
- Не проверять производительность на разных поколениях устройств.
Согласно документации Apple: ARKit Best Practices







