Как остановить визуализатор GSMapView?

Я заметил проблему с производительностью при использовании 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, что делает его плохим кандидатом для долгосрочного решения.

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


person markvasiv    schedule 24.11.2018    source источник


Ответы (1)


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

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

PreferredFrameRate относится к перечислению GMSFrameRate. Который имеет значения:

  1. kGMSFrameRatePowerSave
  2. kGMSFrameRateКонсервативный
  3. kGMSFrameRateMaximum

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

person Dylan    schedule 10.12.2018