Подтвердить что ты не робот

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 и т.д., Но я ничего не могу найти о новой версии.

4b9b3361

Ответ 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