Kris

Разные платформы — разные судьбы: руководство по выбору схемы сжатия

3D-сжатиеСжатие текстурСжатие вершинОптимизацияКонвейер

В предыдущих четырёх частях мы рассмотрели инструменты для сжатия вершин и текстур. Но уметь пользоваться инструментами — это одно, а какой из них использовать и в каком сценарии — совсем другое. Эта статья отвечает именно на этот вопрос — и старается сделать так, чтобы вы могли принять решение сразу после прочтения.

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

Сначала определитесь: сценарий, а не инструмент

Вся статья строится на одном ключевом принципе, который неоднократно подчёркивался в этой серии:

Не существует «лучшего» метода сжатия, есть только «наиболее подходящий для сценария».

Три переменные, влияющие на выбор:

  1. Платформа/устройство: десктопный ПК, мобильный браузер, VR-шлем, мини-приложения — возможности кардинально различаются.
  2. Способ использования: однократный просмотр (страница товара в интернет-магазине) или длительное погружение (VR-игра).
  3. Основное узкое место: медленная загрузка, нехватка видеопамяти или задержки при декодировании на первом экране.

Сначала чётко определите узкое место, а потом возвращайтесь к выбору инструментов. Приведённая ниже матрица закрепляет этот подход.

Основная матрица решений: платформа × рекомендуемая схема

Это самая важная таблица статьи. Для каждой платформы указаны рекомендуемые схемы для текстур и вершин, а также обоснование.

Платформа / сценарийСхема для текстурСхема для вершинОсновное узкое местоКлючевое обоснование
Десктопный Web (ПК-браузер)KTX2 или WebPMeshOpt / квантизацияСкорость загрузкиВидеопамяти достаточно, важны маленький размер и быстрая загрузка
Мобильный Web (браузер на телефоне)KTX2 (обязательно)MeshOptВидеопамятьУ телефона мало видеопамяти, текстуры нужно сжимать блоками
WebXR / VR-шлемKTX2 (обязательно)MeshOpt + LODВидеопамять + FPSПереполнение видеопамяти приведёт к краху, падение FPS — к тошноте
VK Mini Apps (мини-приложения)KTX2 / WebPMeshOpt / чистая квантизацияРазмер пакета + совместимостьОграничение по размеру пакета, избегайте тяжёлых декодеров
Демонстрация товаров в интернет-магазинахWebP (лёгкий) / KTX2 (точный)MeshOptСкорость первого экранаТребуется мгновенная загрузка, размер в обмен на скорость
Крупные сцены / цифровые двойникиKTX2 (обязательно)MeshOpt + Draco + LODВидеопамять + draw callТекстур много, модель большая — сжимать всё

Несколько запоминающихся выводов:

  • Если узкое место — видеопамять, KTX2 обязателен (мобильные, VR, крупные сцены).
  • Если узкое место — скорость загрузки, а видеопамяти достаточно, WebP тоже подойдёт (десктоп, интернет-магазины).
  • В средах, чувствительных к размеру пакета (как мини-приложения), предпочтительнее MeshOpt, а не Draco — декодер меньше, совместимость лучше.
  • Draco стоит рассматривать только для очень больших моделей; для большинства средних и малых моделей MeshOpt более сбалансирован.

Полное сравнение форматов текстур

Знать только «используйте KTX2» недостаточно. Рассмотрим все измерения для конкретных форматов:

ФорматРазмер файлаИспользование видеопамятиСкорость загрузкиСовместимостьКачество изображенияПодходящие сценарии
PNGБольшойБольшой (после распаковки)МедленнаяОчень широкаяБез потерьТребуются точные значения/прозрачность, или для старых платформ
JPGОчень малыйБольшой (после распаковки)МедленнаяОчень широкаяС потерямиЦветовые карты, приоритет сетевой передачи
WebPОчень малыйБольшой (после распаковки)МедленнаяДостаточно широкаяВысокоеДесктопный Web, когда важна скорость загрузки
AVIFЕщё меньшеБольшой (после распаковки)МедленнаяПостепеннаяВысокоеНовые платформы, экстремальное сжатие
KTX2 (ETC1S)МалыйОчень малыйБыстраяТребуется перекодировкаСреднее (цвета достаточны)Цветовые карты, мобильные/VR
KTX2 (UASTC)СреднийМалыйБыстраяТребуется перекодировкаВысокоеКарты нормалей/данные

Обратите внимание, что для первых трёх строк (PNG/JPG/WebP/AVIF) использование видеопамяти везде «Большое» — независимо от того, насколько мал файл на диске, при загрузке в видеопамять он распаковывается обратно в исходные пиксели. Это фундаментальное ограничение традиционных форматов.

Смешанная стратегия очень распространена: ключевые цветовые карты сжимаются в KTX2 для экономии видеопамяти, а второстепенные (например, небольшая emissive-карта) — в WebP для простоты. Не обязательно всё переводить в KTX2; распределяйте по узким местам.

Блок-схема принятия решений: выбирайте шаг за шагом

Матрица — это результат, а блок-схема показывает, как к нему прийти.

На какой платформе работает ваш проект?
│
├─ Десктопный Web (видеопамяти достаточно)
│   └─ Медленный первый экран?
│       ├─ Да → WebP (или AVIF) + MeshOpt  [в приоритете скорость загрузки]
│       └─ Нет, но много моделей → KTX2 + MeshOpt [запаситесь на будущее]
│
├─ Мобильный Web / VR / Крупные сцены (видеопамять в дефиците)
│   └─ Текстуры обязательно KTX2 (цвета ETC1S, данные UASTC)
│       └─ Вершины модели слишком плотные?
│           ├─ Да → + Draco [экстремальное сжатие, смиритесь с медленным декодированием]
│           └─ Нет → + MeshOpt [сбалансировано]
│
└─ Мини-приложения / ограниченная среда выполнения
    └─ Чувствительность к размеру пакета?
        ├─ Высокая → чистая квантизация или MeshOpt + WebP [нулевой/маленький декодер]
        └─ Терпимо → MeshOpt + KTX2 [обычная комбинация]

Сжатие вершин vs сжатие текстур: куда вкладываться?

Часто спрашивают: бюджет ограничен, что оптимизировать в первую очередь? Смотрите на состав модели:

Характеристика моделиПриоритет вложенийПричина
PBR-персонаж/товар (много текстур)Сжатие текстурТекстуры занимают 80%+ объёма, отдача от вершин мала
CAD/сканированная модель (очень плотные вершины, мало текстур)Сжатие вершинВершины — основной объём
Анимированный персонаж (скелет + скиннинг)Вложиться в оба, но вершины в первую очередь, кроме DracoАнимационные данные тоже занимают место, Draco плохо поддерживает анимацию
Здание/сцена (большая, средние текстуры)Текстуры + LODТекстуры экономят видеопамять, LOD — draw call

Примерная оценка эффективности: текстуры KTX2 > вершины MeshOpt/квантизация > упрощение геометрии (LOD) > вершины Draco. Сначала делайте то, что даёт наибольший эффект.

Смешанная стратегия: ключевые текстуры — KTX2, второстепенные — WebP

Не все текстуры стоит сжимать в KTX2. Типичный PBR-материал содержит 5–6 карт; сжимать все в KTX2 трудоёмко и иногда не нужно.

Практическое разделение:

  • Обязательно KTX2: albedo (большая, цветная), normal (чувствительная к точности), roughness/metallic (влияет на освещение)
  • Можно WebP/JPG: emissive (обычно маленькая), AO (низкие/средние частоты), детальная нормаль (если есть)

Критерий: большая ли текстура, содержит ли высокочастотные детали, будет ли часто сэмплироваться. Если всё три «да» → KTX2; если ни одного → традиционный формат для простоты.

Автоматизированный выбор: всё одной командой с gltf-transform

Команда optimize в gltf-transform — это универсальное решение для большинства сценариев. Она автоматически определяет тип текстур, сжимает их по рекомендуемой стратегии и опционально обрабатывает вершины.

# Установка
npm install -g @gltf-transform/cli

# Стандартная оптимизация: текстуры KTX2 + вершины MeshOpt + удаление избыточности
gltf-transform optimize model.glb model-optimized.glb \
  --texture-compress basisu \
  --meshopt

Описание параметров:

ПараметрДействиеПо умолчанию
--texture-compress basisuСжать текстуры в KTX2 (автоматический выбор ETC1S/UASTC)Выкл
--meshoptВключить сжатие вершин MeshOptВыкл
--simplifyУпрощение геометрии (уменьшение вершин, с потерями)Выкл
--weldОбъединение повторяющихся вершинВкл
--pruneУдаление неиспользуемых узлов/материаловВкл

Подходящая для мобильных устройств «жёсткая» комбинация сжатия:

gltf-transform optimize model.glb model-mobile.glb \
  --texture-compress basisu \
  --meshopt \
  --simplify --simplify-ratio 0.5 \
  --prune --weld

Для десктопа «мягкая» комбинация (сохранить детали, сжать только текстуры и вершины):

gltf-transform optimize model.glb model-desktop.glb \
  --texture-compress webp \
  --meshopt

Не хотите писать скрипты? Используйте Any3D для онлайн-сжатия

Не хотите устанавливать Node.js и настраивать инструментарий? Any3D Онлайн-сжатие обрабатывает файлы прямо в браузере — выберите GLB, настройте параметры визуально под платформу (мобильный/десктоп/VR), модель не загружается на сервер (вся обработка локальная), и одним кликом экспортируйте сжатую версию. В основе — тот же gltf-transform, но с нулевым порогом входа. В следующей статье, посвящённой сквозной практике, мы объединим весь процесс.

Шпаргалка в одной ф

Поддержите нас