Разные платформы — разные судьбы: руководство по выбору схемы сжатия
В предыдущих четырёх частях мы рассмотрели инструменты для сжатия вершин и текстур. Но уметь пользоваться инструментами — это одно, а какой из них использовать и в каком сценарии — совсем другое. Эта статья отвечает именно на этот вопрос — и старается сделать так, чтобы вы могли принять решение сразу после прочтения.
Прочитав её, вы сможете ответить: на какой платформе работает мой проект, является ли узким местом загрузка или видеопамять, и какие схемы сжатия текстур и вершин нужно применить.
Сначала определитесь: сценарий, а не инструмент
Вся статья строится на одном ключевом принципе, который неоднократно подчёркивался в этой серии:
Не существует «лучшего» метода сжатия, есть только «наиболее подходящий для сценария».
Три переменные, влияющие на выбор:
- Платформа/устройство: десктопный ПК, мобильный браузер, VR-шлем, мини-приложения — возможности кардинально различаются.
- Способ использования: однократный просмотр (страница товара в интернет-магазине) или длительное погружение (VR-игра).
- Основное узкое место: медленная загрузка, нехватка видеопамяти или задержки при декодировании на первом экране.
Сначала чётко определите узкое место, а потом возвращайтесь к выбору инструментов. Приведённая ниже матрица закрепляет этот подход.
Основная матрица решений: платформа × рекомендуемая схема
Это самая важная таблица статьи. Для каждой платформы указаны рекомендуемые схемы для текстур и вершин, а также обоснование.
| Платформа / сценарий | Схема для текстур | Схема для вершин | Основное узкое место | Ключевое обоснование |
|---|---|---|---|---|
| Десктопный Web (ПК-браузер) | KTX2 или WebP | MeshOpt / квантизация | Скорость загрузки | Видеопамяти достаточно, важны маленький размер и быстрая загрузка |
| Мобильный Web (браузер на телефоне) | KTX2 (обязательно) | MeshOpt | Видеопамять | У телефона мало видеопамяти, текстуры нужно сжимать блоками |
| WebXR / VR-шлем | KTX2 (обязательно) | MeshOpt + LOD | Видеопамять + FPS | Переполнение видеопамяти приведёт к краху, падение FPS — к тошноте |
| VK Mini Apps (мини-приложения) | KTX2 / WebP | MeshOpt / чистая квантизация | Размер пакета + совместимость | Ограничение по размеру пакета, избегайте тяжёлых декодеров |
| Демонстрация товаров в интернет-магазинах | 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, но с нулевым порогом входа. В следующей статье, посвящённой сквозной практике, мы объединим весь процесс.