Viewport culling — один из ключевых механизмов оптимизации рендеринга в HERE Technologies Maps API, отвечающий за исключение из обработки всех объектов, которые не попадают в текущую область видимости карты. В условиях динамического взаимодействия пользователя с картой (панорамирование, зумирование, вращение) этот механизм становится критически важным для поддержания высокой производительности интерфейса.
Viewport culling основан на геометрическом пересечении объектов карты с текущим видимым прямоугольником экрана (viewport). Карта в браузере представляет собой проекцию географических координат в двумерное пространство, поэтому каждая сущность — будь то тайл, маркер или геометрия — может быть проверена на попадание в область видимости.
Основная идея заключается в том, что:
Viewport в HERE Maps API описывается прямоугольником в экранных координатах:
Каждый объект карты имеет собственный bounding box (ограничивающий прямоугольник), также выраженный в экранных координатах после проекции из географических координат.
Проверка пересечения сводится к классической задаче:
В основе отображения карт в HERE Technologies лежит тайловая система. Карта разбивается на квадратные тайлы фиксированного размера (обычно 256×256 пикселей).
Viewport culling на уровне тайлов работает следующим образом:
Формально:
Это позволяет резко сократить количество HTTP-запросов и операций декодирования изображений или векторных данных.
Marker и object layer culling выполняется на уровне JavaScript runtime и WebGL (в зависимости от режима рендеринга).
Каждый объект имеет:
Алгоритм:
Особенность HERE Maps API заключается в том, что многие операции выполняются батчами, чтобы уменьшить количество пересечений в цикле рендера.
В векторном режиме рендеринга viewport culling частично переносится на GPU. Здесь применяется:
После проекции координат в clip space выполняется проверка:
Таким образом GPU самостоятельно исключает значительную часть геометрии до rasterization.
Bounding box — базовая структура для всех уровней culling. Он используется:
Векторные объекты часто имеют предварительно вычисленный географический bounding box:
После проекции он преобразуется в экранные координаты и используется для проверки пересечения с viewport.
При большом количестве объектов (например, тысячи маркеров) применяется кластеризация, которая фактически является расширенной формой culling:
Это снижает количество DOM- или WebGL-объектов, участвующих в отрисовке.
При перемещении карты viewport culling не пересчитывается с нуля. Вместо этого используется инкрементальный подход:
Это особенно важно при плавном pan/zoom, где пересечения меняются постепенно.
Для ускорения viewport culling в HERE Technologies Maps API используются пространственные индексы:
R-tree позволяет выполнять запрос вида:
в логарифмическое время относительно количества объектов.
Для полигонов и полилиний применяется более сложный culling:
Это позволяет корректно отображать объекты, частично выходящие за границы экрана.
Обобщённый pipeline выглядит так:
Viewport culling снижает сложность рендеринга с:
до:
На практике это означает:
В кастомных слоях поверх HERE Maps API часто встречаются проблемы:
Корректная реализация всегда учитывает: