Оптимизация 3D-моделей для AR (LOD, текстуры, полигонаж)
3D-художник сдал модель кресла — 1.2 миллиона полигонов, текстуры 8192×8192 PNG. В Cinema 4D рендер выглядит отлично. В AR на iPhone — 18 FPS и перегрев за 3 минуты. Проблема не в приложении и не в ARKit — проблема в том, что для рендеринга на мобильном GPU модель не подготовлена.
Полигонаж: сколько реально нужно
На экране телефона расстояние до AR-объекта — 0.5–3 метра. На этом расстоянии детализация выше 100–150K полигонов визуально неотличима от 50K. Правило практики:
| Размер объекта | Рекомендуемый полигонаж | Расстояние просмотра |
|---|---|---|
| Небольшой (чашка, телефон) | 5 000–15 000 | 0.3–1 м |
| Средний (кресло, лампа) | 15 000–50 000 | 0.5–2 м |
| Крупный (диван, шкаф) | 30 000–80 000 | 1–3 м |
| Очень крупный (автомобиль) | 50 000–120 000 | 2–10 м |
Decimation в Blender: Modifier → Decimate → Collapse с Ratio = 0.05–0.1 для сложных моделей даёт нужный результат без ручного ретопологии. Quadric Edge Collapse Decimation лучше сохраняет форму краёв чем Unsubdivide.
После decimation — обязательная проверка в AR на целевом устройстве, а не только в превью редактора. Силуэт объекта важнее внутренних деталей — декодируем по-другому.
Текстуры: форматы и размеры
Самое большое влияние на производительность — текстуры. Не полигонаж.
ASTC (Adaptive Scalable Texture Compression) — правильный формат для мобильного AR. Поддерживается всеми ARM Mali и Qualcomm Adreno GPU с 2014+ года. ASTC 6×6 даёт примерно 2.37 bpp против 32 bpp у PNG — в 13 раз меньше памяти GPU при минимальных потерях качества.
ETC2 — универсальный fallback для старых устройств (GLES 3.0+). Хуже ASTC по качеству сжатия, но поддерживается шире.
Никогда PNG/JPEG в текстурах AR-сцены. PNG декодируется в полный RGBA8888 — для текстуры 2048×2048 это 16 MB GPU-памяти. ASTC 2048×2048 — около 2 MB.
Генерация ASTC через astcenc (командная строка):
astcenc -cl input.png output.astc 6x6 -medium
В Xcode Asset Catalog: добавляем текстуру, устанавливаем Compression = Lossy → автоматически ASTC на iOS. На Android — компиляция через Android Studio или в CI через texturetool.
Размер текстур. Правило: размер текстуры пропорционален видимой площади объекта на экране. Для объекта занимающего 20% экрана — текстура 512×512 даёт неотличимый от 2048×2048 результат. Mipmap — обязателен: SceneKit и ARCore автоматически используют уровень mipmap соответствующий размеру отображения.
LOD для AR
В отличие от игровых движков, ARKit SceneKit не имеет встроенного LOD-менеджера. Реализуем через SCNLevelOfDetail:
let highPolyGeometry = loadGeometry("chair_high.usdz") // 50K полигонов
let medPolyGeometry = loadGeometry("chair_med.usdz") // 15K полигонов
let lowPolyGeometry = loadGeometry("chair_low.usdz") // 5K полигонов
let lod1 = SCNLevelOfDetail(geometry: medPolyGeometry, screenSpaceRadius: 100)
let lod2 = SCNLevelOfDetail(geometry: lowPolyGeometry, screenSpaceRadius: 30)
node.geometry?.levelsOfDetail = [lod1, lod2]
screenSpaceRadius — радиус bounding sphere в экранных пикселях. При значении 100 — модель занимает около 200×200 пикселей. Числа подбираются под конкретный объект эмпирически.
На Android ARCore с Filament LOD реализуется через MaterialInstance swap или через RenderableManager.Builder.boundingBox() для culling.
USDZ / glTF: правильный формат для AR
USDZ (iOS, macOS) — контейнер на основе OpenUSD от Pixar. Содержит геометрию, материалы, анимации, физику. Поддерживает AR Quick Look без кода. Reality Converter (macOS-приложение от Apple) конвертирует из FBX/OBJ/glTF в USDZ с одновременной оптимизацией текстур.
glTF 2.0 (Android/Cross-platform) — открытый стандарт, нативно поддерживается Filament и Sceneform. glb — бинарный вариант, предпочтителен для AR (один файл вместо нескольких). Оптимизация через gltf-pipeline:
gltf-pipeline -i model.gltf -o model_opt.glb \
--draco.compressMeshes --draco.quantizePositionBits 14
Draco compression (Google) уменьшает размер геометрии в 5–10 раз за счёт сжатия с потерями. Качество регулируется quantizeBits — 14 бит достаточно для большинства AR-объектов.
Сроки
Оптимизация одной 3D-модели (decimation + текстуры + LOD) — 0.5–1 день. Пакетная оптимизация каталога из 20–50 моделей — 1–2 недели с настройкой пайплайна автоматизации.







