Метод render() относится к низкоуровневому API,
отвечающему за немедленный запуск цикла отрисовки карты. Он инициирует
обновление WebGL-сцены, пересчитывает состояние стилей, источников
данных и слоёв, а затем выполняет компоновку и вывод кадра в canvas.
В отличие от событийно-ориентированных обновлений,
render() используется как принудительный механизм
синхронизации визуального состояния карты с внутренним состоянием
данных.
Основная задача render() — форсировать
немедленную отрисовку текущего состояния карты, даже если
библиотека не зафиксировала изменений, требующих перерисовки.
Метод применяется в ситуациях, когда:
Архитектура рендеринга построена вокруг WebGL-пайплайна и событийного планировщика кадров.
При вызове render() происходит следующая
последовательность:
Важно, что render() обходит ожидание
requestAnimationFrame, если это возможно, и может вызвать
синхронный рендер.
map.render();
Метод не принимает параметров и не возвращает значимого результата. Его поведение зависит от внутреннего состояния карты:
В экосистеме Mapbox GL JS существует важное разделение между принудительным рендером и запросом перерисовки.
Метод render() часто применяется при создании внешнего
рендер-цикла, когда управление кадрами выходит за пределы стандартного
поведения карты.
Пример: синхронизация с внешним таймером
function customAnimationLoop() {
updateExternalState();
map.render();
requestAnimationFrame(customAnimationLoop);
}
customAnimationLoop();
В этом сценарии карта становится частью общего графического конвейера приложения.
При динамической замене GeoJSON-данных стандартный поток обновления
может быть асинхронным. В таких случаях render()
гарантирует немедленное отображение изменений.
const source = map.getSource('points');
source.setData({
type: 'FeatureCollection',
features: updatedFeatures
});
map.render();
Без принудительного рендера обновление может быть отложено до следующего frame tick.
При изменении визуальных параметров слоёв (paint/layout properties) библиотека обычно автоматически помечает карту как dirty. Однако в сложных сценариях (batch updates) может потребоваться ручной вызов:
map.setPaintProperty('roads', 'line-width', 4);
map.setLayoutProperty('labels', 'visibility', 'none');
map.render();
Такой подход минимизирует задержку между изменениями состояния и визуальным результатом.
Частое использование render() может приводить к
избыточной нагрузке на GPU и CPU.
Ключевые особенности:
Оптимальная стратегия — комбинирование с
triggerRepaint() и событийной моделью обновлений.
Mapbox GL JS уже использует внутренний цикл
requestAnimationFrame. Вызов render()
может:
Поэтому использование метода требует контроля внешнего event loop.
При получении данных через WebSocket:
socket.onmess age = (event) => {
const data = JSON.parse(event.data);
map.getSource('live').setData(data);
map.render();
};
Когда карта является частью симуляции:
function stepSimulation() {
physics.update();
map.render();
}
window.addEventListener('resize', () => {
map.resize();
map.render();
});
При вызове render() происходит полная или частичная
пересборка графического состояния:
Особенно затратными являются операции:
render() в каждом mousemove без
throttling;setData() без batching;triggerRepaint() в пользу полного
рендера;Такие паттерны приводят к деградации производительности и нестабильному frame pacing.
Метод тесно связан с жизненным циклом карты:
styledatasourcedatarenderidleВызов render() может повлиять на генерацию событий
render и idle, так как фактически инициирует
новый цикл отрисовки независимо от внешних изменений состояния.