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

时间:2017-09-15 07:31:20

标签: ios xcode google-maps xcode9

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

CPU usage

这只是在我更新到Xcode 9和Swift 4后才开始发生的。 在iPhone 7,8或X 模拟器上的Xcode 9中进行调试时,所有使用iOS 11,只需100%以上的CPU,并且每次我完全停止UI更新大约一秒钟试着移动它。我开始拖动手势,但UI只会每秒更新一次。有效地给我 1fps

然而,在使用 iOS 9 的iPhone 6 模拟器上的Xcode 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等,但我找不到任何关于新版本的内容。

1 个答案:

答案 0 :(得分:18)

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

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

编辑:为了澄清,这些症状正是您所描述的: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