Как нарисовать тысячи объектов на карте и не убить FPS: эволюция рендера на Mapbox GL
vientooscuro 16 минут назад Как нарисовать тысячи объектов на карте и не убить FPS: эволюция рендера на Mapbox GL 7 мин 543 iOS * Swift * Программирование * Кейс В прошлой статье про нетривиальные анимации я обещал...
Anthropic — What company has the best second artificial intelligence model at the end of June?
В сфере искусственного интеллекта произошло заметное событие. vientooscuro 16 минут назад Как нарисовать тысячи объектов на карте и не убить FPS: эволюция рендера на Mapbox GL 7 мин 543 iOS * Swift * Программирование * Кейс В прошлой статье про нетривиальные анимации я обещал показать «ту самую карту с облаками, zoom и движением по кривой Безье». Начну, правда, не с самой анимации, а с того, что было до неё: прежде чем что-то красиво анимировать на карте, надо это что-то на карте хотя бы нарисовать. Контекст: я делал геолокационную соцсеть.
На карте – «облака», посты, привязанные к точке на местности. И вся история ниже – про то, как я пять раз упёрся в производительность и что с каждым разом делал. Наивный подход: одно облако – одна аннотацияПервое, что приходит в голову на любой карте (хоть MapKit, хоть Mapbox), – это аннотации.
Технические детали
У тебя есть объект с координатой, ты создаёшь MGLAnnotation, отдаёшь карте addAnnotation, а в делегате возвращаешь вьюшку:let annotation = MGLPointAnnotation() annotation. addAnnotation(annotation) func mapView(_ mapView: MGLMapView, viewFor annotation: MGLAnnotation) -> MGLAnnotationView? { let view = CloudAnnotationView(...
) // UIView с картинкой облака return view } Работает отлично – пока облаков десятки. Дальше начинается боль:Каждая аннотация – это UIView в иерархии. Сотни и тысячи UIView, которые карта пытается позиционировать на каждый кадр движения, – это гарантированная просадка FPS.
При зуме/скролле карта дёргает делегат, пересоздаёт и перекладывает вьюшки. На «тысяче мест» это уже не карта, а слайд-шоу. На старых устройствах (а в 2016–2018 это был добрый кусок аудитории) всё это умирало ещё раньше.
Отраслевые последствия
Тупик кластеризацииОчевидный ответ на «слишком много маркеров» – кластеризация: рядом стоящие точки схлопываем в один кружок с числом. Я честно прошёл этот путь дважды. Сначала подключил ObjC-библиотеку кластеризации (GClusterManager и компания).
Стало лучше, но всё равно тупило: каждый кластер – это снова аннотация с imageView. Когда я писал эту статью, я нашёл это в собственной истории коммитов:«Новая кластеризация, которая не тупит. Теперь мест дофига может быть на карте»То есть я выкинул первую библиотеку и взял вторую (поверх Google Maps Utils).
Помогло, стало заметно лучше, но кластеризация имеет свою проблему: при кластеризации точки в группе получают одну координату. Есть два основных способа расставлять кластеры на карте: это может быть центр прямоугольника и это может быть центр масс материальных точек – в данном случае это чаты на карте. Можно задавать разные веса, можно одинаковые, но в любом случае мы не видим самых главных вещей: где именно на карте точно сосредоточены чаты и где наибольшая активность.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





