Сжатие данных в CesiumJS ориентировано на минимизацию объёма передаваемой и обрабатываемой информации при сохранении визуальной точности трёхмерных сцен. Основной фокус делается на геометрию, текстуры, структурные данные тайлов и сетевые ответы. Архитектура Cesium предполагает потоковую загрузку, поэтому эффективность сжатия напрямую влияет на производительность рендеринга и плавность навигации по сцене.
Ключевые уровни, на которых применяется сжатие:
Одним из основных методов оптимизации геометрии в 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:
Более современная альтернатива — meshoptimizer (meshopt), интегрированная в glTF pipeline.
Meshopt ориентирован не только на сжатие, но и на:
CesiumJS поддерживает meshopt через расширения glTF:
EXT_meshopt_compressionПреимущество meshopt заключается в более высокой скорости декодирования, что критично для потоковых сцен.
Одним из базовых методов уменьшения размера является квантизация вершинных атрибутов.
Идея заключается в переходе от 32-битных float значений к меньшим диапазонам с фиксированной точностью.
Вместо хранения координат:
x, y, z → float32
используется:
x, y, z → uint16 / uint8 + масштаб + offset
Cesium активно использует:
Это позволяет:
3D Tiles является ключевым форматом потоковой передачи данных в CesiumJS. Он сам по себе является многоуровневой системой оптимизации.
Каждый набор данных разбивается на:
Каждый уровень содержит упрощённую версию данных.
На разных уровнях используются:
Для уменьшения дублирования данных применяются:
Batched 3D Model3D Tiles InstancingЭто позволяет хранить одну геометрию и многократно её переиспользовать с разными трансформациями.
CesiumJS использует KTX2 (Khronos Texture Container) как основной контейнер для GPU-сжатых текстур.
Внутри KTX2 чаще всего используется:
CesiumJS динамически выбирает формат в зависимости от уровня детализации тайла.
Помимо геометрии и текстур, важную роль играет сжатие самих тайлов.
При передаче через HTTP используются:
Они применяются к:
Brotli обычно даёт лучшее сжатие, особенно для JSON-структур 3D Tiles.
glTF в бинарной форме (.glb) уже является компактным
форматом, но в CesiumJS дополнительно применяются:
Это снижает количество HTTP-запросов и упрощает потоковую загрузку.
CesiumJS активно работает с point cloud данными через 3D Tiles.
Основные методы оптимизации:
Точки организуются в октодерево:
Каждая точка хранится в:
Цвет, интенсивность и классификация также сжимаются через:
Для уменьшения потерь точности при больших координатах применяется подход:
Это позволяет:
CesiumJS ориентирован на progressive streaming, где:
Сжатие напрямую влияет на баланс:
На практике CesiumJS использует комбинации методов:
Каждый слой решает свою задачу:
3D Tiles позволяет загружать только видимую часть сцены.
Каждый тайл содержит:
Это позволяет системе:
Параметр geometric error влияет на:
Чем выше error:
Сжатие данных в CesiumJS тесно связано с кешированием:
Сжатие уменьшает не только трафик, но и давление на кеш-систему, позволяя хранить больше тайлов.
Система сжатия в CesiumJS представляет собой многоуровневую цепочку преобразований:
Каждый уровень снижает объём данных, сохраняя визуальную достоверность сцены и обеспечивая возможность интерактивного рендеринга больших трёхмерных миров в браузере.