Tile loading стратегии

Тайловая загрузка в CesiumJS строится вокруг идеи потоковой подгрузки геоданных по уровню детализации, зависящему от положения камеры, плотности пикселей и геометрической сложности сцены. Основная цель стратегии — минимизировать объём передаваемых данных при сохранении визуальной точности в области интереса и плавности взаимодействия.

В основе большинства механизмов загрузки лежит LOD (Level of Detail). Геопространственные данные представляются в виде иерархии тайлов, где каждый следующий уровень содержит более детализированную версию предыдущего.

При движении камеры CesiumJS решает, какие тайлы:

  • необходимо отобразить сейчас
  • можно выгрузить
  • следует заменить более детализированными

Ключевым параметром является Screen Space Error (SSE) — оценка визуальной погрешности проекции тайла на экран. Если ошибка превышает порог, выполняется разбиение (refinement) и загрузка дочерних тайлов.

SSE

Этот принцип обеспечивает адаптивную детализацию: ближние области рендерятся с высокой точностью, удалённые — с упрощённой геометрией.

Система приоритетов запросов

CesiumJS использует централизованный планировщик запросов, который регулирует поток загрузки ресурсов из сети. В условиях ограниченной пропускной способности критически важно определить, какие тайлы загружать первыми.

Приоритет формируется на основе нескольких факторов:

  • расстояние от камеры до тайла
  • вклад тайла в текущий кадр (screen space error)
  • вероятность немедленного отображения
  • тип данных (геометрия, текстуры, elevation)

Каждый запрос получает числовой вес, используемый в очереди планировщика. Это позволяет предотвращать ситуации, когда второстепенные данные блокируют загрузку важных для текущего кадра элементов.

Ограничение конкурентных запросов

Браузерные ограничения на количество параллельных HTTP-запросов вынуждают CesiumJS использовать глобальный контроль загрузки.

RequestScheduler управляет:

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

Если сеть перегружена, система может:

  • отложить низкоприоритетные тайлы
  • отменить устаревшие запросы (например, после движения камеры)
  • перераспределить пропускную способность между слоями

Эта модель предотвращает “затор” загрузки, когда устаревшие данные продолжают поступать, хотя уже не нужны.

Кэширование тайлов и повторное использование

Кэширование играет ключевую роль в оптимизации потоковой загрузки. CesiumJS использует многоуровневый кэш:

  • память GPU (для текстур и буферов)
  • оперативная память (геометрия, метаданные)
  • внутренние структуры тайлового дерева

Каждый тайл хранится с учётом его идентификатора и уровня детализации. При повторном попадании камеры в ту же область система избегает повторной загрузки, используя уже доступные данные.

Кэш управляется по принципу LRU (Least Recently Used), что позволяет автоматически освобождать память при росте сцены.

Стратегии refinement: заменяемость и подгрузка

Каждый тайл в CesiumJS может иметь стратегию refinement:

  • REPLACE — текущий тайл заменяется более детализированными
  • ADD — новый уровень накладывается поверх существующего

REPLACE используется чаще в terrain и 3D Tiles, обеспечивая плавную замену уровней детализации без дублирования геометрии. ADD характерен для некоторых типов векторных и растровых слоёв.

Выбор стратегии напрямую влияет на нагрузку на GPU и сеть. ADD увеличивает количество одновременно активных объектов, тогда как REPLACE требует более точного управления переходами.

Потоковая загрузка 3D Tiles

Формат 3D Tiles является основой для потоковой передачи трёхмерных городских моделей и облаков точек. Он использует иерархическую структуру bounding volume hierarchy (BVH), где каждый узел содержит:

  • bounding volume (сфера, коробка или геометрический регион)
  • ссылку на дочерние тайлы
  • метаданные и содержимое

Загрузка начинается с корневого узла и постепенно углубляется в дерево в зависимости от позиции камеры.

Ключевой механизм — view frustum culling: тайлы вне видимого объёма камеры не загружаются вообще, что резко снижает нагрузку.

Геометрический и экранный culling

Перед загрузкой каждого тайла выполняется серия проверок:

  • находится ли bounding volume в frustum
  • превышает ли SSE допустимый порог
  • не перекрыт ли тайл более детализированной версией

Эти проверки позволяют избегать загрузки данных, которые не будут визуально заметны пользователю.

Дополнительно используется occlusion culling, если включены соответствующие оптимизации: тайлы, закрытые более близкими объектами, не отправляются в рендер и часто не загружаются вовсе.

Прогрессивная загрузка и декодирование

CesiumJS поддерживает асинхронную декомпозицию данных. Тайлы могут загружаться в несколько этапов:

  1. получение бинарного блока
  2. декодирование геометрии
  3. загрузка текстур
  4. подготовка GPU ресурсов

Эти этапы разделены, чтобы не блокировать основной поток рендеринга. Особенно это критично для больших 3D Tiles наборов, где декодирование может занимать значительное время.

При этом используется модель “lazy upload”: GPU-ресурсы создаются только в момент, когда тайл становится видимым.

Стратегии предзагрузки (preloading)

Для повышения плавности навигации CesiumJS может загружать тайлы, которые ещё не видимы, но вероятно станут видимыми при дальнейшем движении камеры.

Предзагрузка основана на:

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

Эта стратегия снижает эффект “pop-in”, когда объекты резко появляются при пересечении порога SSE.

Управление пропускной способностью

CesiumJS адаптирует поведение загрузки в зависимости от состояния сети. Если пропускная способность ограничена, система:

  • снижает количество одновременно загружаемых тайлов
  • повышает порог SSE (уменьшая детализацию)
  • приоритизирует центральную область экрана

Если сеть стабильна, активируется более агрессивная стратегия загрузки с увеличением числа параллельных запросов.

Тайловые схемы и их влияние на стратегию загрузки

Разные схемы разбиения пространства влияют на алгоритмы загрузки:

  • quadtree (2D карты и imagery layers)
  • octree (3D пространство)
  • irregular tiling (3D Tiles с произвольной структурой)

Quadtree обеспечивает предсказуемую структуру, где каждый тайл делится на четыре дочерних. Это упрощает планирование загрузки и кэширование.

Octree применяется в сложных 3D сценах, где пространство делится на восемь подузлов, что увеличивает глубину дерева, но повышает точность локализации объектов.

Управление изображениями и terrain слоями

ImageryLayer и terrain provider используют собственные стратегии загрузки, основанные на плиточной сетке.

Для изображений применяется:

  • XYZ tile scheme
  • TMS (Tile Map Service)
  • WMTS (Web Map Tile Service)

Каждый формат определяет порядок индексации тайлов и направление координатной системы, что влияет на алгоритм запроса.

Terrain использует аналогичную иерархию, но дополнительно учитывает высотные данные и нормали, что увеличивает объём декодирования.

Динамическая балансировка сцены

При комбинировании imagery, terrain и 3D Tiles возникает необходимость балансировки ресурсов между различными слоями.

CesiumJS распределяет бюджет рендеринга между:

  • геометрией (3D Tiles)
  • текстурами (imagery)
  • высотными данными (terrain)

Если один слой становится слишком тяжёлым, система может временно снижать его детализацию, чтобы сохранить стабильный FPS.

Отмена устаревших запросов

При перемещении камеры старые запросы становятся неактуальными. CesiumJS активно использует механизм отмены:

  • запросы, потерявшие приоритет, прерываются
  • тайлы, не попавшие в текущий frustum, не загружаются до конца
  • декодирование может быть прервано на ранних этапах

Это предотвращает ситуацию, когда сеть расходуется на данные, которые уже не будут использованы.

Влияние плотности пикселей и device scale

На устройствах с высоким DPI стратегия загрузки изменяется. Порог SSE корректируется с учётом:

  • devicePixelRatio
  • разрешения экрана
  • угла обзора камеры

Это позволяет сохранять одинаковую визуальную точность на разных устройствах без избыточной загрузки данных.

Координация между слоями и синхронизация состояния

Все тайловые системы синхронизируются через единый цикл обновления сцены. В каждом кадре выполняются этапы:

  • обновление состояния камеры
  • пересчёт видимости тайлов
  • планирование загрузок
  • обработка завершённых запросов
  • обновление кэша и сцены

Такая структура гарантирует согласованность между визуальным состоянием и сетевой активностью.

Ошибки и деградация качества

При перегрузке сети или недостатке памяти CesiumJS применяет стратегии деградации качества:

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

Эти механизмы позволяют сохранить интерактивность сцены даже при нестабильных условиях, жертвуя детализацией ради производительности.