Общие свойства всех слоев

Базовая модель слоя

В основе архитектуры Deck.gl лежит концепция слоя как декларативного описания визуализации данных. Каждый слой представляет собой независимый модуль, который преобразует входной набор данных в геометрические примитивы WebGL и управляет их отрисовкой.

Ключевой принцип:

Слой не хранит визуализацию напрямую — он описывает, как данные должны быть превращены в графику.

Все слои в Deck.gl наследуют общий базовый класс Layer, что задаёт единый контракт поведения и набор универсальных свойств.


Данные как первичный источник состояния

Практически каждый слой работает через параметр data, который определяет входной набор объектов.

Основные особенности:

  • data может быть массивом, итератором, GeoJSON, табличными структурами
  • слой не изменяет исходные данные
  • визуализация строится через доступоры (accessors)

Типичный паттерн:

  • getPosition
  • getColor
  • getRadius
  • getWeight

Каждый accessor — это функция, которая принимает элемент данных и возвращает значение, используемое в GPU-пайплайне.

Важно: Deck.gl строго отделяет данные от визуального представления. Один и тот же набор данных может быть визуализирован разными слоями без модификации структуры.


Универсальные свойства слоёв

Идентификация слоя

Каждый слой может иметь уникальный идентификатор:

  • id — строковый идентификатор слоя

Он используется для:

  • диффинга между обновлениями
  • сохранения состояния
  • управления слоями в композиции

Управление видимостью и прозрачностью

Все слои поддерживают базовые визуальные параметры:

  • visible — включает или отключает слой без удаления
  • opacity — глобальная прозрачность слоя

Особенность реализации:

opacity применяется на уровне шейдеров, что позволяет сохранять производительность без CPU-композитинга.


Поддержка интерактивности

Deck.gl предоставляет единый механизм взаимодействия:

  • pickable — включает обработку событий наведения и клика
  • autoHighlight — автоматическое подсвечивание объекта при hover
  • highlightColor — цвет подсветки

Механизм picking работает через GPU-идентификацию объектов, где каждый элемент слоя кодируется в уникальный цвет буфера picking.


Геометрическая система координат

Все слои поддерживают унифицированное описание координатного пространства:

  • coordinateSystem — определяет систему координат (например, Web Mercator, cartesian)
  • coordinateOrigin — смещение начала координат
  • modelMatrix — матрица трансформации модели

Эти параметры позволяют:

  • комбинировать слои из разных источников координат
  • выполнять локальные трансформации без изменения данных
  • работать с 2D и 3D сценами одновременно

Доступоры (Accessors) как ядро параметризации

Accessor-паттерн является центральным механизмом всех слоёв.

Примеры:

  • getPosition(d) → координаты
  • getColor(d) → цвет
  • getSize(d) → размер
  • getAngle(d) → ориентация

Особенности:

  • могут быть функциями или константами
  • вычисляются для каждого элемента данных
  • кэшируются через систему атрибутов

Ключевая идея: accessors отделяют данные от визуальной логики и позволяют масштабировать визуализацию на миллионы объектов.


Система атрибутов и GPU-буферы

Каждый слой использует внутреннюю систему атрибутов:

  • атрибуты хранятся в виде WebGL buffer objects
  • вычисляются через WebGL или CPU-генерацию
  • автоматически обновляются при изменении данных или accessors

Примеры атрибутов:

  • позиции вершин
  • цвета
  • радиусы
  • индексы

Преимущества:

  • минимизация пересчётов
  • использование GPU-параллелизма
  • переиспользование буферов между кадрами

Условные триггеры обновления

Deck.gl использует механизм updateTriggers, который управляет пересчётом атрибутов.

Он позволяет указать зависимости вида:

  • изменение accessor-функции
  • изменение внешних параметров

Пример логики:

  • если изменился getColor, пересчитывается только цветовой атрибут
  • если изменился data, пересчитываются все атрибуты

Это критично для производительности в больших сценах.


Жизненный цикл слоя

Каждый слой проходит стандартные этапы:

  • initializeState — создание GPU-ресурсов и состояния
  • updateState — реакция на изменение props
  • draw — отрисовка в WebGL контексте
  • finalizeState — освобождение ресурсов

Внутренний state слоя включает:

  • буферы атрибутов
  • кэшированные данные
  • модели WebGL
  • промежуточные вычисления

Диффинг и обновление слоёв

Deck.gl использует механизм сравнения слоёв между кадрами.

Сравниваются:

  • id
  • props
  • data
  • updateTriggers

Результат диффинга определяет:

  • нужно ли пересоздавать слой
  • какие атрибуты пересчитать
  • можно ли переиспользовать GPU-ресурсы

Это позволяет эффективно обновлять сложные сцены без полной перерисовки.


Параметры WebGL-рендеринга

Все слои поддерживают низкоуровневую настройку WebGL через parameters.

Примеры:

  • blending режимы
  • depth test
  • stencil operations
  • culling

Эти параметры позволяют:

  • интегрировать слои с кастомными WebGL пайплайнами
  • управлять порядком наложения
  • оптимизировать производительность

Система расширений слоёв

Deck.gl поддерживает extensions, которые модифицируют поведение слоя.

Расширения могут:

  • добавлять новые атрибуты
  • модифицировать шейдеры
  • изменять рендеринг
  • вводить дополнительные параметры

Архитектурно extensions работают как плагины поверх базового слоя без изменения его кода.


Трансформации и матричная модель

Для всех слоёв доступна поддержка трансформаций:

  • локальные преобразования объектов
  • глобальные сцены
  • анимации через матрицы

modelMatrix применяется на уровне шейдеров, что обеспечивает:

  • высокую производительность
  • отсутствие CPU-зависимых пересчётов
  • совместимость с 3D сценами

Механизм переходов (transitions)

Слои поддерживают анимацию изменений параметров:

  • переход цвета
  • изменение размеров
  • перемещение геометрии

Transitions работают через интерполяцию значений между состояниями кадра.

Особенность:

анимации выполняются на GPU, а не через DOM или CPU таймеры, что обеспечивает стабильную производительность при больших данных.


Оптимизация и масштабирование

Общие свойства слоёв ориентированы на работу с большими наборами данных:

  • инстансинг геометрии
  • батчинг отрисовки
  • минимизация WebGL вызовов
  • кэширование атрибутов

Deck.gl рассчитан на сценарии, где количество объектов измеряется сотнями тысяч и миллионами.


Событийная модель и взаимодействие

Интерактивность реализуется через единый слой событий:

  • hover
  • click
  • pick
  • drag (в отдельных слоях)

Каждое событие связано с конкретным элементом данных через picking-информацию, включающую:

  • индекс объекта
  • слой
  • координаты
  • оригинальные данные элемента