Тайловая загрузка в CesiumJS строится вокруг идеи потоковой подгрузки геоданных по уровню детализации, зависящему от положения камеры, плотности пикселей и геометрической сложности сцены. Основная цель стратегии — минимизировать объём передаваемых данных при сохранении визуальной точности в области интереса и плавности взаимодействия.
В основе большинства механизмов загрузки лежит LOD (Level of Detail). Геопространственные данные представляются в виде иерархии тайлов, где каждый следующий уровень содержит более детализированную версию предыдущего.
При движении камеры CesiumJS решает, какие тайлы:
Ключевым параметром является Screen Space Error (SSE) — оценка визуальной погрешности проекции тайла на экран. Если ошибка превышает порог, выполняется разбиение (refinement) и загрузка дочерних тайлов.
SSE
Этот принцип обеспечивает адаптивную детализацию: ближние области рендерятся с высокой точностью, удалённые — с упрощённой геометрией.
CesiumJS использует централизованный планировщик запросов, который регулирует поток загрузки ресурсов из сети. В условиях ограниченной пропускной способности критически важно определить, какие тайлы загружать первыми.
Приоритет формируется на основе нескольких факторов:
Каждый запрос получает числовой вес, используемый в очереди планировщика. Это позволяет предотвращать ситуации, когда второстепенные данные блокируют загрузку важных для текущего кадра элементов.
Браузерные ограничения на количество параллельных HTTP-запросов вынуждают CesiumJS использовать глобальный контроль загрузки.
RequestScheduler управляет:
Если сеть перегружена, система может:
Эта модель предотвращает “затор” загрузки, когда устаревшие данные продолжают поступать, хотя уже не нужны.
Кэширование играет ключевую роль в оптимизации потоковой загрузки. CesiumJS использует многоуровневый кэш:
Каждый тайл хранится с учётом его идентификатора и уровня детализации. При повторном попадании камеры в ту же область система избегает повторной загрузки, используя уже доступные данные.
Кэш управляется по принципу LRU (Least Recently Used), что позволяет автоматически освобождать память при росте сцены.
Каждый тайл в CesiumJS может иметь стратегию refinement:
REPLACE используется чаще в terrain и 3D Tiles, обеспечивая плавную замену уровней детализации без дублирования геометрии. ADD характерен для некоторых типов векторных и растровых слоёв.
Выбор стратегии напрямую влияет на нагрузку на GPU и сеть. ADD увеличивает количество одновременно активных объектов, тогда как REPLACE требует более точного управления переходами.
Формат 3D Tiles является основой для потоковой передачи трёхмерных городских моделей и облаков точек. Он использует иерархическую структуру bounding volume hierarchy (BVH), где каждый узел содержит:
Загрузка начинается с корневого узла и постепенно углубляется в дерево в зависимости от позиции камеры.
Ключевой механизм — view frustum culling: тайлы вне видимого объёма камеры не загружаются вообще, что резко снижает нагрузку.
Перед загрузкой каждого тайла выполняется серия проверок:
Эти проверки позволяют избегать загрузки данных, которые не будут визуально заметны пользователю.
Дополнительно используется occlusion culling, если включены соответствующие оптимизации: тайлы, закрытые более близкими объектами, не отправляются в рендер и часто не загружаются вовсе.
CesiumJS поддерживает асинхронную декомпозицию данных. Тайлы могут загружаться в несколько этапов:
Эти этапы разделены, чтобы не блокировать основной поток рендеринга. Особенно это критично для больших 3D Tiles наборов, где декодирование может занимать значительное время.
При этом используется модель “lazy upload”: GPU-ресурсы создаются только в момент, когда тайл становится видимым.
Для повышения плавности навигации CesiumJS может загружать тайлы, которые ещё не видимы, но вероятно станут видимыми при дальнейшем движении камеры.
Предзагрузка основана на:
Эта стратегия снижает эффект “pop-in”, когда объекты резко появляются при пересечении порога SSE.
CesiumJS адаптирует поведение загрузки в зависимости от состояния сети. Если пропускная способность ограничена, система:
Если сеть стабильна, активируется более агрессивная стратегия загрузки с увеличением числа параллельных запросов.
Разные схемы разбиения пространства влияют на алгоритмы загрузки:
Quadtree обеспечивает предсказуемую структуру, где каждый тайл делится на четыре дочерних. Это упрощает планирование загрузки и кэширование.
Octree применяется в сложных 3D сценах, где пространство делится на восемь подузлов, что увеличивает глубину дерева, но повышает точность локализации объектов.
ImageryLayer и terrain provider используют собственные стратегии загрузки, основанные на плиточной сетке.
Для изображений применяется:
Каждый формат определяет порядок индексации тайлов и направление координатной системы, что влияет на алгоритм запроса.
Terrain использует аналогичную иерархию, но дополнительно учитывает высотные данные и нормали, что увеличивает объём декодирования.
При комбинировании imagery, terrain и 3D Tiles возникает необходимость балансировки ресурсов между различными слоями.
CesiumJS распределяет бюджет рендеринга между:
Если один слой становится слишком тяжёлым, система может временно снижать его детализацию, чтобы сохранить стабильный FPS.
При перемещении камеры старые запросы становятся неактуальными. CesiumJS активно использует механизм отмены:
Это предотвращает ситуацию, когда сеть расходуется на данные, которые уже не будут использованы.
На устройствах с высоким DPI стратегия загрузки изменяется. Порог SSE корректируется с учётом:
Это позволяет сохранять одинаковую визуальную точность на разных устройствах без избыточной загрузки данных.
Все тайловые системы синхронизируются через единый цикл обновления сцены. В каждом кадре выполняются этапы:
Такая структура гарантирует согласованность между визуальным состоянием и сетевой активностью.
При перегрузке сети или недостатке памяти CesiumJS применяет стратегии деградации качества:
Эти механизмы позволяют сохранить интерактивность сцены даже при нестабильных условиях, жертвуя детализацией ради производительности.