Как остановить рендерер GMSMapView? - PullRequest
0 голосов
/ 24 ноября 2018

Я заметил проблему с производительностью при использовании GMSMapView как части моей иерархии представлений.Важное примечание: карта не занимает весь экран, она используется как заголовок табличного представления.Эти проблемы влияют на поведение самого табличного представления - низкий FPS, что приводит к плохому пользовательскому интерфейсу, поэтому я пытаюсь решить эти проблемы или, по крайней мере, понять, что делает GMSMapView.

Использование Time Profiler Iобнаружил, что это вызвано повторным рендерингом GMSMapView для каждого кадра (как я могу сказать), потому что самая тяжелая трассировка стека в основном потоке:

enter image description here

Который вызывается из: CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION

(я полагаю, именно так работают внутренние карты Google Maps - он регистрирует CADisplayLink с помощью runloop и повторно отображает его в каждом кадре)

Это приводит к интенсивной загрузке ЦП (до 99%):

enter image description here

Обратите внимание, что в выбранной области ничего не происходит с приложением,он просто отображает статическую карту и табличное представление (без взаимодействия с пользователем, без смены фреймов, без чего-либо)

Если я проведу тот же тест без GMSMapView в качестве подпредставления, загрузка ЦП в том же месте почти0%:

enter image description here

Теперь к вопросу. Почему это происходит и как остановить это поведение?

Я нашел метод с именем - (void) stopRendering в GMSMapView и протестировал его - результаты хорошие, и я получаю ту же производительность, что икогда я полностью удаляю вид карты.Однако этот метод помечен как устаревший, и в нем говорится, что он будет удален в будущих выпусках SDK, что делает его плохим кандидатом для долгосрочного решения.

Любая помощь, объяснение или подсказкицениться!

1 Ответ

0 голосов
/ 10 декабря 2018

Проблема с stopRendering заключается в том, что он возлагает бремя управления состоянием карты на разработчика.

Вместо использования stopRendering вы должны ограничить частоту кадров объекта.GMSMapView имеет свойство с именем предпочитаемый_фрейм .Вы должны использовать это.В документации говорится, что по умолчанию для значение selectedFrameRate установлено максимальное значение, или для повторного рендеринга каждого кадра.

Предпочитаемый тип перечисления EnframeRate GMSFrameRate .Имеет значения:

  1. kGMSFrameRatePowerSave
  2. kGMSFrameRateConservative
  3. kGMSFrameRateMaximum

Вы должны использовать # 2, чтобы карта оставалась текучейво время взаимодействия с пользователем, но также не рендерится без необходимости.По умолчанию для параметраrialFrameRate установлено значение # 3.

...