Asset оптимизация

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
  • адаптивная загрузка тайлов
  • приоритизация центральной области экрана
  • временное отключение второстепенных слоёв

Такая стратегия обеспечивает стабильность сцены даже при перегруженных ассетах.