В системе рендеринга CesiumJS управление уровнями детализации
является базовым механизмом оптимизации, обеспечивающим баланс между
визуальным качеством и производительностью при работе с глобальной
сценой.
Иерархическая структура
данных
Геопространственные данные в CesiumJS почти всегда организуются в
виде иерархий:
- плитки (tiles) для 3D Tiles
- тайлы высот (terrain tiles)
- изображения (imagery tiles)
Каждая сущность существует в нескольких масштабах детализации,
формируя дерево (обычно quadtree или octree). Узлы дерева содержат:
- геометрию (для 3D Tiles)
- растровые данные (для terrain/imagery)
- метаданные и ссылку на дочерние узлы
- параметр геометрической ошибки (geometric error)
Именно это значение управляет тем, насколько детализированным может
быть узел при отрисовке.
Geometric Error как основа
LOD
В 3D Tiles ключевой параметр — geometricError.
Он определяет максимально допустимое отклонение упрощённой геометрии
от оригинала.
При рендеринге Cesium выполняет сравнение:
- если ошибка слишком велика → узел subdivide (разделяется)
- если ошибка мала → узел принимается как есть
Формально решение можно интерпретировать как зависимость от
расстояния до камеры и разрешения экрана.
Screen Space Error
Одним из центральных механизмов является Screen Space Error
(SSE) — ошибка в пикселях на экране.
Основной параметр настройки:
Поведение:
- меньше значение → выше детализация, больше нагрузка
- больше значение → ниже детализация, выше производительность
LOD-выбор определяется сравнением:
- проецируемой геометрической ошибки
- текущего масштаба и расстояния до камеры
Refinement: ADD и REPLACE
Для 3D Tiles существует два режима уточнения:
- REPLACE — родительский тайл заменяется
дочерними
- ADD — дочерние тайлы добавляются поверх
родительского
REPLACE используется чаще, так как обеспечивает корректную
иерархическую замену геометрии без наложений.
ADD применяется для специфических случаев, например, при слоистых
данных.
Кэширование и потоковая
подгрузка
LOD тесно связан с потоковой загрузкой:
- тайлы загружаются по мере необходимости
- ранее загруженные узлы кэшируются
- невидимые или удалённые из фрустума узлы выгружаются
Это позволяет работать с гигабайтами и терабайтами данных без
предварительной загрузки всей сцены.
Skirting:
устранение разрывов между уровнями детализации
Skirting — это механизм добавления «юбок» (skirt geometry) к краям
плиток, используемый для устранения визуальных разрывов между соседними
уровнями детализации.
Проблема, которую решает
skirting
При использовании LOD возникает характерная проблема:
- соседние тайлы имеют разную детализацию
- высоты вершин не совпадают идеально
- между тайлами появляются щели (cracks)
Особенно это заметно:
- на стыках terrain tiles
- при наклонной камере
- при резком переходе между уровнями детализации
Принцип работы skirting
Skirting добавляет дополнительную геометрию вдоль границ плитки:
- вертикальные полигоны «спускаются» вниз
- скрывают щели между соседними тайлами
- визуально «зашивают» границы
Идея проста: даже если вершины верхней поверхности не совпадают,
вертикальная юбка перекрывает возможный зазор.
Skirting в terrain системе
В terrain-провайдерах:
- каждая плитка высот может генерировать skirt по периметру
- высота юбки обычно зависит от минимальной высоты тайла или
фиксированного смещения
- применяется динамически при загрузке узла
Это критично для глобальных DEM-моделей (цифровых моделей рельефа),
где перепады высот и уровни детализации резко меняются.
Skirting в 3D Tiles
В контексте 3D Tiles:
- аналогичная проблема возникает на границах батчей
- используется геометрическое расширение или padding
- иногда применяются внутренние методы расширения bounding volume
Хотя термин «skirt» чаще ассоциируется с terrain, концептуально он
распространяется и на плиточные модели.
Взаимодействие LOD и
skirting
LOD и skirting тесно связаны, поскольку именно переходы между
уровнями детализации создают визуальные артефакты.
Основные сценарии
появления артефактов
Разные уровни terrain tiles
- один тайл уже subdivided
- соседний ещё нет
Разные геометрические ошибки
- упрощённые узлы не совпадают с детализированными
Асинхронная загрузка
- один тайл уже заменён
- другой ещё в процессе загрузки
Как skirting компенсирует
LOD
- скрывает вертикальные зазоры между разными уровнями
- снижает заметность pop-in эффекта
- сглаживает переходы между тайлами разного разрешения
При этом skirting не влияет на сам алгоритм выбора LOD — он работает
исключительно на уровне геометрического «маскирования».
Фрустум-куллинг и его
влияние на LOD
LOD-алгоритм тесно интегрирован с frustum culling:
- тайлы вне поля зрения не рассматриваются
- не производится оценка SSE для них
- не выполняется загрузка дочерних узлов
Это снижает нагрузку на CPU и сеть, особенно при работе с глобальными
сценами.
Дополнительно используется:
- distance-based culling
- horizon culling (для глобальной сферы)
- clipping по bounding volumes
Качество
изображения против производительности
LOD в CesiumJS управляется компромиссом:
Повышение качества
- уменьшение
maximumScreenSpaceError
- увеличение глубины дерева загрузки
- агрессивная предзагрузка дочерних тайлов
Результат:
- высокая детализация
- более плавные переходы
- увеличение нагрузки на GPU/CPU/сеть
Повышение производительности
- увеличение
maximumScreenSpaceError
- ограничение максимального уровня детализации
- сокращение количества одновременно загруженных тайлов
Результат:
- быстрее рендеринг
- меньше сетевых запросов
- возможна потеря детализации
Temporal LOD и эффект
«поп-ина»
При загрузке данных наблюдается эффект:
- сначала отображается упрощённый тайл
- затем он заменяется более детализированным
Это называется tile pop-in.
Skirting частично скрывает визуальные артефакты перехода, но не
устраняет сам факт замены.
Для уменьшения эффекта применяются:
- предварительная загрузка (prefetch)
- увеличенный cache budget
- постепенная refinement стратегия
Роль экранного
разрешения и масштабирования
LOD зависит от:
- разрешения экрана
- zoom-уровня камеры
- угла обзора
- расстояния до поверхности
При увеличении DPI:
- один и тот же тайл может требовать более высокой детализации
- SSE фактически становится строже
Итеративная подгрузка и
адаптация сцены
Система LOD в CesiumJS работает как непрерывный цикл:
- оценка видимых тайлов
- вычисление SSE
- выбор узлов дерева
- загрузка необходимых ресурсов
- рендеринг кадра
- повтор
Skirting в этом цикле не участвует в принятии решений, но применяется
на этапе геометрической генерации тайла.
Влияние сетевых задержек
LOD-качество напрямую зависит от:
- latency сети
- пропускной способности
- скорости декодирования тайлов
При высоких задержках:
- временно используются более грубые уровни
- увеличивается визуальная задержка уточнения
- skirting становится более заметным как стабилизирующий фактор
Практическая модель
поведения системы
Поведение CesiumJS можно представить как три слоя:
LOD-алгоритм
- выбор структуры сцены
- работа с SSE и geometricError
стриминг-движок
- загрузка/кэширование/выгрузка тайлов
геометрическая компенсация
- skirting
- padding
- сглаживание границ
Именно взаимодействие этих уровней обеспечивает стабильную
визуализацию глобальных данных в реальном времени без предварительного
рендеринга всей сцены.