Performance в Mapbox GL JS опирается на комбинацию возможностей браузерного Performance API, внутреннего рендер-цикла WebGL и событийной модели загрузки источников данных. Основная задача слоя производительности — обеспечить измеримость каждого этапа: от запроса тайла до финального кадра, от парсинга стиля до выполнения отрисовки в WebGL-контексте.
Внутри Mapbox GL JS производительность не является отдельным модулем, а распределена между несколькими уровнями:
performance (High Resolution Time API)Ключевая идея заключается в том, что каждый этап рендеринга карты можно представить как цепочку измеряемых операций: загрузка данных → подготовка геометрии → компиляция стиля → рендер кадра.
Базовый инструмент измерения — window.performance. Он
используется для:
performance.mark)performance.measure)Mapbox GL JS активно опирается на эти данные при включении режима сбора метрик ресурсов.
Типовой сценарий включает:
Рендер-контур карты работает в рамках
requestAnimationFrame. Каждый кадр можно логически
разделить на стадии:
Внутренне Mapbox GL JS отслеживает:
Если frame time превышает ~16.67ms (60 FPS), начинается деградация плавности интерфейса.
Встроенный механизм отображения метрик активируется через опции карты:
Эти данные используются как первичный индикатор узких мест: перегрузка геометрией, избыточные источники или неэффективные стили.
Производительность сильно зависит от типа источников:
Основные затраты:
Производительность чаще всего ограничивается не одной причиной, а комбинацией факторов:
Большое количество вершин увеличивает:
Каждый слой в стиле Mapbox GL JS может:
Layout особенно дорог для symbol layers (тексты, иконки).
Ключевая особенность архитектуры — вынос тяжёлых операций в Web Workers:
Это снижает нагрузку на main thread и уменьшает jank при взаимодействии с UI.
Однако существует ограничение: передача данных между потоками через structured clone также имеет стоимость.
Производительность сильно зависит от стратегий кэширования:
Эффективный кэш снижает:
Методы выборки данных, такие как hit-testing и spatial queries, могут быть критичными:
queryRenderedFeaturesquerySourceFeaturesСтоимость зависит от:
При частых вызовах (например, mousemove) такие операции становятся заметным источником нагрузки.
Mapbox GL JS полностью зависит от WebGL, поэтому производительность определяется GPU-пайплайном:
Особенно дорого:
Событийная модель карты даёт косвенные метрики производительности:
load — завершение начальной загрузки стиляidle — отсутствие активных задач рендерингаrender — каждый кадр рендерингаdata / sourcedata — изменения
источниковИнтервал между render и idle позволяет
оценить, насколько карта перегружена текущими задачами.
Производительность напрямую зависит от архитектуры стиля:
Также критично уменьшение избыточных выражений
(expressions) в стиле, особенно при data-driven
styling.
Основные источники памяти:
При высокой нагрузке возможны:
Производительность Mapbox GL JS можно рассматривать как систему из трёх взаимодействующих слоёв:
Баланс между ними определяет стабильность FPS и отзывчивость карты, при этом узкое место может возникнуть на любом этапе цепочки — от запроса тайла до финального fragment shader.