Сжатие данных

Сжатие данных в CesiumJS ориентировано на минимизацию объёма передаваемой и обрабатываемой информации при сохранении визуальной точности трёхмерных сцен. Основной фокус делается на геометрию, текстуры, структурные данные тайлов и сетевые ответы. Архитектура Cesium предполагает потоковую загрузку, поэтому эффективность сжатия напрямую влияет на производительность рендеринга и плавность навигации по сцене.

Ключевые уровни, на которых применяется сжатие:

  • геометрия (mesh compression)
  • текстуры (texture compression)
  • иерархические структуры тайлов (3D Tiles)
  • сетевые протоколы передачи данных (HTTP compression)
  • бинарные форматы glTF и производные

Сжатие геометрии: Draco и Meshopt

Draco-сжатие

Одним из основных методов оптимизации геометрии в CesiumJS является использование Draco. Это алгоритм, разработанный для эффективного кодирования 3D-геометрии.

В контексте glTF и CesiumJS Draco применяется для:

  • сокращения количества вершинных данных
  • уменьшения индексов треугольников
  • компрессии нормалей и атрибутов вершин

Структурно Draco заменяет «сырые» буферы на компактное представление, которое декодируется на стороне клиента.

Пример конфигурации glTF с Draco:

{
  "extensionsUsed": ["KHR_draco_mesh_compression"],
  "meshes": [
    {
      "primitives": [
        {
          "extensions": {
            "KHR_draco_mesh_compression": {
              "bufferView": 2,
              "attributes": {
                "POSITION": 0,
                "NORMAL": 1
              }
            }
          }
        }
      ]
    }
  ]
}

Особенности использования Draco в CesiumJS:

  • декодирование происходит в WebWorker
  • возможна задержка первого кадра из-за распаковки
  • значительное снижение трафика при сложной геометрии

Meshopt

Более современная альтернатива — meshoptimizer (meshopt), интегрированная в glTF pipeline.

Meshopt ориентирован не только на сжатие, но и на:

  • оптимизацию порядка индексов для GPU cache
  • сжатие атрибутов с минимальными потерями
  • улучшение рантайм-декодирования по сравнению с Draco

CesiumJS поддерживает meshopt через расширения glTF:

  • EXT_meshopt_compression

Преимущество meshopt заключается в более высокой скорости декодирования, что критично для потоковых сцен.


Квантизация геометрии

Одним из базовых методов уменьшения размера является квантизация вершинных атрибутов.

Идея заключается в переходе от 32-битных float значений к меньшим диапазонам с фиксированной точностью.

Принцип

Вместо хранения координат:

x, y, z → float32

используется:

x, y, z → uint16 / uint8 + масштаб + offset

Применение в Cesium

Cesium активно использует:

  • quantized positions в 3D Tiles
  • нормализованные атрибуты
  • предрасчитанные bounding volumes

Это позволяет:

  • уменьшить размер тайлов до 70–90%
  • ускорить загрузку
  • снизить нагрузку на память GPU

3D Tiles как система сжатия данных

3D Tiles является ключевым форматом потоковой передачи данных в CesiumJS. Он сам по себе является многоуровневой системой оптимизации.

Иерархическая структура

Каждый набор данных разбивается на:

  • root tile
  • child tiles
  • leaf tiles

Каждый уровень содержит упрощённую версию данных.

Геометрическое упрощение

На разных уровнях используются:

  • decimation (снижение числа полигонов)
  • агрегация точек
  • замена мешей bounding volume representations

Batched 3D Model и instancing

Для уменьшения дублирования данных применяются:

  • Batched 3D Model
  • 3D Tiles Instancing

Это позволяет хранить одну геометрию и многократно её переиспользовать с разными трансформациями.


Сжатие текстур: KTX2 и Basis Universal

KTX2 как основной формат

CesiumJS использует KTX2 (Khronos Texture Container) как основной контейнер для GPU-сжатых текстур.

Внутри KTX2 чаще всего используется:

  • Basis Universal (ETC1S / UASTC)

Преимущества

  • загрузка напрямую в GPU без декомпрессии в RGBA
  • уменьшение памяти видеокарты
  • ускорение отрисовки

Сценарии применения

  • спутниковые подложки
  • материалы зданий
  • PBR-текстуры

Basis Universal: два режима компрессии

ETC1S

  • высокая степень сжатия
  • меньшая детализация
  • подходит для удалённых LOD-уровней

UASTC

  • более высокое качество
  • больший размер
  • используется для ближних планов

CesiumJS динамически выбирает формат в зависимости от уровня детализации тайла.


Сжатие 3D Tiles на уровне транспорта

Помимо геометрии и текстур, важную роль играет сжатие самих тайлов.

gzip и brotli

При передаче через HTTP используются:

  • gzip
  • brotli

Они применяются к:

  • JSON метаданным
  • binary glTF (в некоторых случаях)
  • tile headers

Brotli обычно даёт лучшее сжатие, особенно для JSON-структур 3D Tiles.


Binary glTF и минимизация overhead

glTF в бинарной форме (.glb) уже является компактным форматом, но в CesiumJS дополнительно применяются:

  • выравнивание буферов
  • устранение избыточных accessor-ов
  • объединение bufferView

Это снижает количество HTTP-запросов и упрощает потоковую загрузку.


Сжатие точечных облаков

CesiumJS активно работает с point cloud данными через 3D Tiles.

Основные методы оптимизации:

Octree-структуры

Точки организуются в октодерево:

  • плотные регионы разбиваются глубже
  • редкие области хранятся компактно

Квантизация точек

Каждая точка хранится в:

  • локальной системе координат
  • с уменьшенной точностью (int16/int32)

Атрибуты

Цвет, интенсивность и классификация также сжимаются через:

  • нормализацию
  • палитры
  • индексацию

RTC_CENTER и относительная геометрия

Для уменьшения потерь точности при больших координатах применяется подход:

  • хранение координат относительно локального центра (RTC_CENTER)

Это позволяет:

  • уменьшить количество значащих цифр
  • повысить точность float32 операций
  • снизить ошибки при глобальных сценах

Потоковая загрузка и компромиссы сжатия

CesiumJS ориентирован на progressive streaming, где:

  • сначала загружается низкополигональная версия
  • затем подгружаются уточнения

Сжатие напрямую влияет на баланс:

  • сильное сжатие → меньше трафика, больше CPU-декодинга
  • слабое сжатие → больше трафика, меньше вычислений

Комбинированные стратегии оптимизации

На практике CesiumJS использует комбинации методов:

  • Draco + KTX2 + 3D Tiles quantization
  • meshopt + Brotli + instancing
  • point cloud quantization + octree + gzip

Каждый слой решает свою задачу:

  • геометрия → Draco / meshopt
  • текстуры → KTX2
  • сеть → Brotli/gzip
  • структура → 3D Tiles hierarchy

Оптимизация загрузки через тайловую систему

3D Tiles позволяет загружать только видимую часть сцены.

Каждый тайл содержит:

  • bounding volume
  • geometric error metric
  • уровень детализации

Это позволяет системе:

  • не загружать лишние данные
  • заменять сложные модели упрощёнными
  • контролировать бюджет производительности

Геометрический error metric и влияние на сжатие

Параметр geometric error влияет на:

  • выбор LOD
  • агрессивность упрощения
  • частоту обновления данных

Чем выше error:

  • тем сильнее сжатие и упрощение
  • тем меньше детализация

Буферизация и кеширование

Сжатие данных в CesiumJS тесно связано с кешированием:

  • in-memory cache для декодированных тайлов
  • IndexedDB cache для повторного использования
  • HTTP cache для статических ресурсов

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


Итоговая архитектура сжатия данных в CesiumJS

Система сжатия в CesiumJS представляет собой многоуровневую цепочку преобразований:

  • исходные 3D-данные
  • оптимизация геометрии (Draco / meshopt)
  • квантизация атрибутов
  • упаковка в glTF / 3D Tiles
  • сжатие текстур (KTX2)
  • сетевое сжатие (Brotli / gzip)
  • потоковая доставка и LOD-иерархия

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