Я создаю нативную карту, используя MapView из 'react-native-maps' и этот механизм кластеризации маркеров. Это компонент кластерного маркера, который отлично работает с молниеносной производительностью:
export default class ClusterMarker extends PureComponent {
constructor(props) {
super(props)
this.state = {
tracksViewChanges: true
}
}
UNSAFE_componentWillReceiveProps(nextProps) {
if (this.props !== nextProps) {
this.setState(() => ({
tracksViewChanges: true,
}))
}
}
componentDidUpdate() {
if (this.state.tracksViewChanges) {
this.setState(() => ({
tracksViewChanges: false,
}))
}
}
render() {
/*...
bunch of unrelated code where 'message', 'image', 'coordinate' and 'pointCount' are set
...*/
return (
<Marker
anchor={{x:0.5,y:0.5}}
centerOffset={{x:0.5,y:0.5}}
coordinate={coordinate}
image={image}
title={pointCount}
description={message}
tracksViewChanges={this.state.tracksViewChanges}>
{/* <Text>{pointCount}</Text> */} <-------- I want this to work just as fast
</Marker>
)
}
}
Видите этот title={pointCount}
в реквизитах маркера? Когда пользователь щелкает кластер, появляется всплывающее окно, показывающее, сколько выводов имеется в кластере. Я хочу вывести этот текст оттуда и отобразить его поверх кластера. Обратите внимание, что в рендере внутри маркера есть строка с комментариями. Когда раскомментирован, визуально он делает почти то, что нужно, но с ужасной производительностью на телефоне (1 кадр в секунду было бы преувеличением).
Понятно, что проблема с текстом. Моя гипотеза состоит в том, что компонент Text продолжает проверять родителя на наличие обновлений текста или постоянно перерисовывает его без всякой причины. Вот список вещей, которые я пытался исправить:
- Создайте компонент, расширяющий текст, выполняющий ту же задачу без странных обновлений или повторного рендеринга. Нет прироста фпс.
- Создайте компонент, который отображает текст, но никогда не обновляет и не выполняет повторный рендеринг без какой-либо причины. Нет прироста фпс.
- Добавьте логику
tracksViewChanges
, которую вы видите выше. Это было своего рода успехом, увеличив средний FPS с 1 до 5. - Используйте другие библиотеки кластеризации маркеров (все они не работали с достойной производительностью даже без Text inside Marker).
- Множество хакерских решений из Интернета, ни одно из которых не улучшило производительность.
Эта карта в настоящее время работает в среднем с 20 000 пинов, и решение должно быть эффективным по мере увеличения этого количества пинов, потому что так оно и будет.
Буду очень рад если кто поможет!