Внутри Mapbox GL JS система загрузки данных построена вокруг централизованного механизма управления сетевыми запросами, который координирует получение тайлов, шрифтов, спрайтов и растровых ресурсов. Этот механизм формирует многоуровневую очередь, где каждый тип ресурса имеет собственную стратегию приоритизации и ограничения параллелизма.
Основная цель системы — обеспечить непрерывное интерактивное отображение карты при нестабильных сетевых условиях и динамическом изменении viewport.
Очередь запросов в Mapbox GL JS не является единой структурой. Она разделяется на несколько специализированных очередей:
Каждая очередь работает по принципу приоритетного планировщика, где ключевым фактором становится видимость ресурса в текущем viewport и потенциальная необходимость его в ближайших кадрах рендеринга.
Система приоритетов строится на нескольких уровнях:
Ресурсы, попадающие в текущую область видимости карты, получают максимальный приоритет. Тайлы, находящиеся ближе к центру экрана, обрабатываются раньше периферийных.
Ресурсы, необходимые для текущего кадра рендеринга, имеют более высокий приоритет по сравнению с теми, которые потребуются в будущем при панорамировании или зуме.
Слои, находящиеся выше в стиле, могут влиять на приоритет загрузки их источников. Например, символические слои (symbol layers) могут запрашивать glyph раньше, чем растровые слои полностью завершат загрузку.
Тайловая система является центральной в механизме запросов. Каждый тайл представляется как объект с уникальным идентификатором (z/x/y), который помещается в очередь загрузки при попадании в область видимости.
Очередь тайлов обладает следующими свойствами:
При изменении положения карты происходит пересортировка очереди: новые тайлы поднимаются в приоритете, а устаревшие запросы могут быть отменены.
Браузерные ограничения на количество одновременных HTTP-запросов требуют строгого контроля конкурентности. В Mapbox GL JS используется лимитированная модель выполнения запросов.
Основные принципы:
Это предотвращает блокировку сети и деградацию производительности при резком изменении масштаба карты.
Система предотвращает дублирование запросов к одному и тому же ресурсу. Если тайл уже находится в процессе загрузки, повторный запрос не создаётся, а подписчики присоединяются к существующему процессу.
Механизм включает:
Это существенно снижает нагрузку на сеть при быстрых перемещениях карты.
При изменении состояния карты многие запросы становятся неактуальными. Система очередей поддерживает механизм отмены:
Особенно важно это при инерционном скроллинге и анимациях zoom, где состояние карты меняется быстрее, чем завершается загрузка ресурсов.
Очередь запросов тесно связана с многоуровневым кэшированием:
Перед постановкой задачи в очередь выполняется проверка кэша. Если ресурс найден, он не попадает в сетевую очередь, а сразу передаётся в pipeline рендеринга.
Кэширование снижает давление на очередь и стабилизирует приоритеты загрузки.
Система использует геометрическую модель приоритизации:
При этом учитывается:
Таким образом очередь фактически становится предиктивной.
В Mapbox GL JS значительная часть обработки тайлов происходит в Web Workers. Очередь запросов разделяется на две логические части:
После завершения загрузки тайл передаётся в worker-очередь обработки, где он преобразуется в GPU-готовые структуры.
Glyph-запросы формируются на основе используемых символов текста в текущем стиле карты. Очередь работает по диапазонам Unicode:
Это снижает количество сетевых обращений и уменьшает задержки при рендеринге подписей.
Sprite-ресурсы загружаются отдельной очередью, так как они:
Приоритет sprite-запросов ниже, чем у тайлов, но выше, чем у фоновых ресурсов. После загрузки sprite-карта кэшируется и используется всеми слоями стиля.
Изменение zoom level приводит к полной перестройке очередей:
Система стремится минимизировать повторную загрузку при плавных zoom-переходах.
Очередь запросов связана с рендер-циклом:
Таким образом загрузка и рендеринг работают как единый асинхронный конвейер.
При ухудшении сетевых условий очередь адаптируется:
Эта адаптация предотвращает резкое падение FPS и обеспечивает деградацию качества вместо полного отказа отображения карты.