GoogleMaps на симуляторе в Xcode 9 использует более 100% CPU при перемещении карты
Итак, теперь я преобразовал свой проект в Swift 4 в Xcode 9 и начал тестировать свое приложение. Это большое приложение с четырьмя отдельными вкладками, и почти все работает так, как ожидалось. Одна из вкладок - это карта, использующая GoogleMaps. Я никогда не испытывал никаких проблем с этим, но когда он был построен с Xcode 9 и показан в Simulator, он использует поверх 100% CPU при перемещении карты, и он очень сильно отстает.
Вот отладочный навигатор при работе на симуляторе.
Мы делаем какой-то пользовательский рисунок, но не на 102% стоимости рисунка.
![Использование ЦП]()
Это только началось, когда я обновился до Xcode 9 и Swift 4.
Когда вы отлаживаете Xcode 9 на iPhone 7, 8 или X симулятор, все с iOS 11, он имеет чуть более 100% процессор, и полностью отключает пользовательский интерфейс примерно на одну секунду каждый раз, когда я попробуйте переместить его. Я начинаю жест перетаскивания, но пользовательский интерфейс обновляется только один раз в секунду. Эффективно давая мне о 1fps.
Однако при отладке в Xcode 9 на симуляторе iPhone с iOS 9 он достигает ~ 90% при перемещении карты и не отставать почти так же. Я предполагаю, что я получаю около 20-30 fps здесь. (Это могут быть те же самые fps, которые я получаю в симуляторах на Xcode 8. Карта никогда не была действительно гладкой на симуляторе.)
При работе на реальном устройстве (iPhone 7, iOS 11), процессор использует около 40% при постоянном перемещении карты и работает очень плавно, без каких-либо задержек (60 кадров в секунду).
Я также получаю это на выходе, как только открываю вкладку с картой, но я думаю, что это не имеет отношения к этому конкретному вопросу:
Main Thread Checker: UI API called on a background thread: -[UIApplication applicationState]
PID: *****, TID: *******, Thread name: com.google.Maps.LabelingBehavior, Queue name: com.apple.root.default-qos.overcommit, QoS: 21
Это говорит о том, что GoogleMapsAPI вызывает [UIApplication applicationState]
в фоновом потоке.
Я использую последнюю версию GoogleMaps: 2.4.0. Насколько мне известно, эта версия может не поддерживать Xcode 9/Swift 4 и т.д., Но я ничего не могу найти о новой версии.
Ответы
Ответ 1
Обновление: Эта проблема исправлена в Xcode 9.1 beta 2
В OpenGLES.framework
есть ошибка, из-за которой он пропускает загрузку LLVM JIT и возвращается к интерпретации шейдеров. Это оказывает сильное влияние на симулятор, поскольку он полностью программно обработан OpenGL (включая CoreAnimation, SceneKit и т.д.).
изменить. Чтобы уточнить, симптомы этого - это то, что вы описываете: 100% или больше использования ЦП и рендеринг 1fps. Это влияет на SDK Google Maps и MapKit.
Как временное обходное решение вы можете скопировать libCoreVMClient.dylib
из Beta 3 в GM Xcode 9, и производительность должна быть восстановлена до того, что было ранее. Это должно выполняться отдельно для каждой платформы.
Для iOS это расположено по адресу: Xcode[-beta].app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/OpenGLES.framework/libCoreVMClient.dylib
Для tvOS это расположено по адресу: Xcode[-beta].app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/tvOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/OpenGLES.framework/libCoreVMClient.dylib
Для watchOS это расположено по адресу: Xcode[-beta].app/Contents/Developer/Platforms/WatchOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/watchOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/OpenGLES.framework/libCoreVMClient.dylib