Skirting и уровни детализации

В системе рендеринга 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) — ошибка в пикселях на экране.

Основной параметр настройки:

  • maximumScreenSpaceError

Поведение:

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

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 тесно связаны, поскольку именно переходы между уровнями детализации создают визуальные артефакты.

Основные сценарии появления артефактов

  1. Разные уровни terrain tiles

    • один тайл уже subdivided
    • соседний ещё нет
  2. Разные геометрические ошибки

    • упрощённые узлы не совпадают с детализированными
  3. Асинхронная загрузка

    • один тайл уже заменён
    • другой ещё в процессе загрузки

Как 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 работает как непрерывный цикл:

  1. оценка видимых тайлов
  2. вычисление SSE
  3. выбор узлов дерева
  4. загрузка необходимых ресурсов
  5. рендеринг кадра
  6. повтор

Skirting в этом цикле не участвует в принятии решений, но применяется на этапе геометрической генерации тайла.


Влияние сетевых задержек

LOD-качество напрямую зависит от:

  • latency сети
  • пропускной способности
  • скорости декодирования тайлов

При высоких задержках:

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

Практическая модель поведения системы

Поведение CesiumJS можно представить как три слоя:

  1. LOD-алгоритм

    • выбор структуры сцены
    • работа с SSE и geometricError
  2. стриминг-движок

    • загрузка/кэширование/выгрузка тайлов
  3. геометрическая компенсация

    • skirting
    • padding
    • сглаживание границ

Именно взаимодействие этих уровней обеспечивает стабильную визуализацию глобальных данных в реальном времени без предварительного рендеринга всей сцены.