Класс Deck является центральной точкой управления
рендерингом в библиотеке Deck.gl и выступает как контейнер верхнего
уровня для всех визуализаций. Он связывает WebGL-контекст, набор слоёв,
параметры камеры, обработку событий и цикл обновления сцены.
Архитектурно Deck можно рассматривать как тонкий
управляющий слой над WebGL, который координирует работу отдельных
визуальных слоёв (Layer), управляет состоянием вида
(viewState) и обеспечивает реактивный рендеринг при
изменениях входных данных.
Создание экземпляра Deck выполняется через конструктор,
принимающий конфигурационный объект. Этот объект определяет всю сцену
рендеринга.
import {Deck} from '@deck.gl/core';
const deck = new Deck({
initialViewState: {
longitude: 37.6173,
latitude: 55.7558,
zoom: 10,
pitch: 0,
bearing: 0
},
controller: true
});
container DOM-элемент, в который будет встроен canvas WebGL. Если не указан, Deck создаёт собственный canvas.
layers Массив экземпляров слоёв, описывающих визуальные данные сцены.
views Описание представлений (View), например
MapView, FirstPersonView,
OrthographicView.
initialViewState Начальное состояние камеры. Используется только при первом создании экземпляра.
viewState Текущее состояние камеры. При его изменении происходит перерасчёт матрицы проекции и перерисовка сцены.
controller Включение интерактивного управления камерой (панорамирование, зум, вращение).
Внутри Deck.gl реализован реактивный цикл обновления. Любое изменение входных данных приводит к перерасчёту и повторному рендеру.
Основные этапы:
setProps)Ключевая особенность заключается в дифференциальном обновлении: пересоздаются только те слои, чьи свойства изменились.
Метод setProps является основным механизмом
динамического обновления состояния Deck.
deck.setProps({
layers: newLayers,
viewState: {
longitude: 30,
latitude: 50,
zoom: 5
}
});
Важно, что setProps не пересоздаёт WebGL контекст, а
только обновляет сцену.
Deck не хранит данные напрямую — он оперирует слоями как
декларативными объектами.
import {ScatterplotLayer} from '@deck.gl/layers';
const layers = [
new ScatterplotLayer({
id: 'points',
data: [
{position: [37.6, 55.7], size: 1000}
],
getPosition: d => d.position,
getRadius: d => d.size,
getFillColor: [255, 0, 0]
})
];
deck.setProps({layers});
idid для дифференциации измененийviewState определяет положение и ориентацию камеры.
deck.setProps({
viewState: {
longitude: 10,
latitude: 20,
zoom: 4,
pitch: 45,
bearing: 30
}
});
Deck пересчитывает матрицы преобразования при каждом изменении этих параметров, что влияет на все слои одновременно.
Контроллер (controller) отвечает за интерактивность
сцены.
const deck = new Deck({
controller: {
scrollZoom: true,
dragPan: true,
doubleClickZoom: true,
touchRotate: true
}
});
Контроллер преобразует пользовательские события в изменения
viewState. Внутри происходит:
Deck создаёт и управляет WebGL2 контекстом (или WebGL1 при отсутствии поддержки).
const deck = new Deck({
glOptions: {
preserveDrawingBuffer: true,
antialias: true,
stencil: true
}
});
Экземпляр Deck проходит несколько стадий:
setPropsdeck.finalize();
Удаляются:
Deck является координатором, но не выполняет вычисления геометрии напрямую. Это делегируется слоям.
Поток данных:
Deck поддерживает мульти-вью композицию.
import {MapView, FirstPersonView} from '@deck.gl/core';
const deck = new Deck({
views: [
new MapView({id: 'map'}),
new FirstPersonView({id: 'fp'})
]
});
Каждый view имеет собственную:
Deck разделяет canvas на несколько областей рендера.
Deck реализует систему picking для интерактивного взаимодействия с объектами.
deck.pickObject({
x: 100,
y: 150
});
Внутри Deck применяются несколько стратегий оптимизации:
Слои группируются для минимизации draw calls.
Геометрия пересоздаётся только при изменении данных.
Шейдерные программы переиспользуются между слоями.
Изменяются только затронутые атрибуты:
Deck работает по модели декларативного обновления.
deck.setProps({
layers: updatedLayers
});
Любое изменение props запускает pipeline:
Deck может генерировать события:
onViewStateChangeonHoveronClickonLoadconst deck = new Deck({
onClick: info => {
console.log(info.object);
}
});
События проходят через систему picking и привязываются к конкретным объектам сцены.
Deck поддерживает плавные переходы состояний.
Изменение viewState может быть интерполировано:
Deck синхронизирует анимацию с render loop, обеспечивая стабильный FPS.
Deck может работать как в автономном режиме, так и встраиваться в внешний render loop.
function animate() {
deck.redraw();
requestAnimationFrame(animate);
}
animate();
Метод redraw принудительно инициирует отрисовку текущего
состояния без изменения props.
Deck автоматически управляет:
Каждый слой может создавать собственные GPU ресурсы, которые освобождаются при:
Deck отслеживает resize контейнера и пересчитывает:
Это гарантирует корректное отображение сцены при адаптивной верстке.