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