CesiumJS опирается на потоковую модель загрузки данных, в которой
сцена формируется из множества независимых ассетов: тайлов 3D Tiles,
текстур, геометрии, изображений подложки, высотных данных и
дополнительных сущностей. Производительность напрямую определяется тем,
как именно эти ассеты подготовлены, сжаты, доставлены и обновляются в
рантайме.
Ключевая особенность архитектуры заключается в том, что рендеринг
отделён от полной загрузки сцены. Система постоянно балансирует между
качеством изображения и объёмом подгружаемых данных, используя
LOD-структуры и приоритетную выборку.
Структура ассетов и узкие
места
Типовая сцена включает несколько уровней данных:
- глобальная подложка (imagery tiles)
- цифровая модель рельефа (terrain)
- 3D-объекты (3D Tiles)
- динамические сущности (Entities API)
- кастомные примитивы (Primitives)
Основные проблемы производительности возникают в следующих
местах:
- избыточный размер текстур
- неэффективная геометрия моделей
- отсутствие LOD или неправильная иерархия тайлов
- слишком частые обновления Entity-системы
- неиспользуемые ресурсы, удерживаемые в памяти
- перегрузка GPU из-за большого количества draw calls
Оптимизация текстурных
ресурсов
Текстуры являются одним из главных факторов загрузки GPU и сети.
Сжатие и форматы GPU-ready
текстур
Использование KTX2 / Basis Universal позволяет существенно снизить
объём передачи данных и ускорить декодирование на клиенте.
- уменьшение размера до 4–8 раз по сравнению с PNG/JPEG
- GPU-декодирование вместо CPU-декодирования
- поддержка нескольких уровней качества в одном файле
Атласирование текстур
Объединение мелких текстур в один атлас снижает количество:
- HTTP-запросов
- переключений текстур на GPU
Мипмапы
Отсутствие mipmap-цепочек приводит к:
- алиасингу
- избыточной загрузке текстур высокой детализации
Mipmaps позволяют системе выбирать оптимальный уровень детализации в
зависимости от расстояния до камеры.
Оптимизация 3D-моделей и
геометрии
Для моделей критично уменьшение количества полигонов без потери
визуальной информации.
Снижение полигональности
Используются:
- decimation (LOD reduction)
- нормал-мапы вместо геометрической детализации
Draco и Meshopt сжатие
Сжатие геометрии уменьшает размер пакетов и ускоряет
декодирование:
- Draco: сильное сжатие, но более высокая CPU-нагрузка
- Meshopt: более быстрый декод, часто предпочтительнее в реальном
времени
3D Tiles как основа
потоковой оптимизации
3D Tiles является ключевой структурой для потоковой загрузки
данных.
Основные оптимизационные параметры tileset:
maximumScreenSpaceError — баланс качества и
производительности
skipLevelOfDetail — ускорение при отдалении камеры
loadSiblings — контроль параллельной загрузки соседних
тайлов
dynamicScreenSpaceError — адаптация под FPS
Правильная настройка LOD-дерева уменьшает количество загружаемых
тайлов на порядок.
Стратегии тайлинга и
серверной подготовки
Эффективная система ассетов начинается не в браузере, а на этапе
генерации данных.
Геометрический тайлинг
- разбиение моделей по пространственным регионам
- адаптивная глубина дерева
- баланс размера тайлов (обычно 50–250 KB для веб-доставки)
Прекомпиляция LOD
LOD должен формироваться заранее, а не вычисляться на клиенте.
Серверная компрессия
Использование:
- gzip / brotli для JSON и бинарных индексов
- HTTP/2 или HTTP/3 для параллельной доставки
- CDN для географического распределения
Оптимизация загрузки и
кэширования
CesiumJS использует внутренние кэши ресурсов, но их эффективность
зависит от структуры данных.
Resource cache
Повторное использование:
- текстур
- буферов геометрии
- imagery tiles
Важно избегать постоянного пересоздания идентичных ресурсов.
Lazy loading
Загрузка только видимых тайлов снижает:
- начальное время рендеринга
- пиковое потребление памяти
Приоритизация запросов
Система запросов CesiumJS распределяет загрузку по:
- близости к камере
- размеру тайла
- визуальной важности
Управление
памятью и жизненным циклом объектов
Неправильное освобождение ресурсов приводит к постепенной деградации
производительности.
Уничтожение сущностей
Entity API требует явного удаления:
entityCollection.remove
- очистка
viewer.entities
Примитивы и сцена
Примитивы необходимо освобождать через:
destroy() у объектов
- удаление из
scene.primitives
Утечки WebGL ресурсов
Особенно критичны:
- текстуры
- vertex buffers
- framebuffers
Оптимизация Entity-системы
Entity API удобна, но дорого обходится при массовом
использовании.
Основные проблемы:
- частые обновления координат
- большое количество динамических объектов
- реактивные привязки свойств
Подходы оптимизации:
- агрегация сущностей в один primitive
- использование BillboardCollection вместо отдельных Entity
- минимизация callback-свойств (time-dynamic properties)
Оптимизация рендеринга и
сцены
Batch rendering
Снижение количества draw calls достигается:
- instancing
- объединением геометрии
- использованием Cesium primitives вместо Entity
Ограничение пересчёта сцены
Избыточные пересчёты возникают при:
- частом изменении камеры
- обновлении большого числа entity
Depth и culling
Фрустрационный culling и occlusion culling уменьшают нагрузку на GPU
за счёт отсечения невидимых объектов.
Imagery и terrain ассеты
Imagery layers
Проблемы возникают при:
- слишком высокой детализации тайлов
- отсутствии корректного tile scheme
Оптимизация:
- использование готовых WMTS/XYZ схем
- контроль maxNativeLevel
- ограничение maxZoom
Terrain
Высотные модели требуют:
- quantized-mesh формата
- корректного LOD
- нормализации вертикального масштаба
Потоковая загрузка и
сетевые ограничения
Ассеты CesiumJS чувствительны к сетевой задержке.
Ключевые факторы:
- количество одновременных HTTP-запросов
- размер каждого tile
- latency между CDN и клиентом
Оптимизационные меры:
- объединение мелких ресурсов
- уменьшение числа запросов через атласы
- HTTP/2 multiplexing
- предварительная загрузка соседних тайлов
GPU-профилирование и
балансировка нагрузки
Основные узкие места GPU:
- overdraw
- excessive fragment shading
- high-resolution textures at distance
Стратегии:
- снижение screen space error
- ограничение максимальной текстурной детализации
- использование lower LOD при высокой нагрузке
Управление
качеством через адаптивные параметры
Адаптивные механизмы CesiumJS позволяют балансировать качество в
реальном времени:
- динамическое снижение LOD при падении FPS
- адаптивная загрузка тайлов
- приоритизация центральной области экрана
- временное отключение второстепенных слоёв
Такая стратегия обеспечивает стабильность сцены даже при
перегруженных ассетах.