Xcode 9 中模拟器上的 Google 地图在移动地图时使用了超过 100% 的 CPU

GoogleMaps on simulator in Xcode 9 uses over 100% of CPU when moving the map

所以我现在将我的项目转换为在 Xcode 9 中使用 Swift 4,并开始测试我的应用程序。这是一款具有四个不同选项卡的大型应用程序,几乎所有内容都按预期运行。其中一个选项卡是地图,使用 GoogleMaps。我从来没有遇到过任何问题,但是当使用 Xcode 9 构建并在模拟器中显示时,它在移动地图时使用 over 100% 的 CPU,它非常滞后。 这是在模拟器上 运行 时的调试导航器。 我们做了一些自定义绘图,但不是 102% 的绘图价值。

这只在我更新到 Xcode 9 和 Swift 4 后才开始发生。 在 iPhone 7、8 或 X 模拟器 上调试 Xcode 9 时,所有 iOS 11,它刚好超过 100% CPU,每次我尝试移动它时,它都会完全阻止 UI 更新大约一秒钟。我开始拖动手势,但 UI 每秒只更新一次。有效地给我大约 1fps.

但是, 在 Xcode 9 中调试 iPhone 6 模拟器 iOS 9,当移动地图时它会上升到 ~90% 并且几乎没有滞后那么多。我猜我在这里得到大约 20-30 fps。 (这可能与我在 Xcode 8 上的模拟器中获得的 fps 相同。地图在模拟器上从未真正流畅过..)

当运行在实际设备上(iPhone 7,iOS 11)时,CPU在不断移动地图时使用了大约40%,并且正在工作非常流畅,完全没有延迟 (60fps)。

我在打开带有地图的选项卡时也会在输出中得到这个,但我认为这与这个特定问题无关:

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等,但我找不到任何关于新版本的信息。

更新: 此问题已在 Xcode 9.1 beta 2

中修复

OpenGLES.framework 中存在一个错误,导致它跳过加载 LLVM JIT 并回退到解释着色器。这对模拟器有严重的性能影响,因为它完全是软件渲染的 OpenGL(包括 CoreAnimation、SceneKit 等)。

edit:澄清一下,这正是您所描述的症状:100% 或更高 CPU 使用率和 <1fps 渲染。这会影响 Google Maps SDK 和 MapKit。

作为临时解决方法,您可以将 libCoreVMClient.dylib 从 Beta 3 复制到 Xcode 9 GM,性能应该会恢复到以前的水平。这必须分别为每个平台运行时完成。

对于 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