Я заметил проблему с производительностью при использовании GMSMapView как части моей иерархии представлений.Важное примечание: карта не занимает весь экран, она используется как заголовок табличного представления.Эти проблемы влияют на поведение самого табличного представления - низкий FPS, что приводит к плохому пользовательскому интерфейсу, поэтому я пытаюсь решить эти проблемы или, по крайней мере, понять, что делает GMSMapView.
Использование Time Profiler Iобнаружил, что это вызвано повторным рендерингом GMSMapView для каждого кадра (как я могу сказать), потому что самая тяжелая трассировка стека в основном потоке:
Который вызывается из: CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION
(я полагаю, именно так работают внутренние карты Google Maps - он регистрирует CADisplayLink с помощью runloop и повторно отображает его в каждом кадре)
Это приводит к интенсивной загрузке ЦП (до 99%):
Обратите внимание, что в выбранной области ничего не происходит с приложением,он просто отображает статическую карту и табличное представление (без взаимодействия с пользователем, без смены фреймов, без чего-либо)
Если я проведу тот же тест без GMSMapView в качестве подпредставления, загрузка ЦП в том же месте почти0%:
Теперь к вопросу. Почему это происходит и как остановить это поведение?
Я нашел метод с именем - (void) stopRendering
в GMSMapView и протестировал его - результаты хорошие, и я получаю ту же производительность, что икогда я полностью удаляю вид карты.Однако этот метод помечен как устаревший, и в нем говорится, что он будет удален в будущих выпусках SDK, что делает его плохим кандидатом для долгосрочного решения.
Любая помощь, объяснение или подсказкицениться!