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

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

CPU使用率

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

但是,iOS 9的iOS 6 模拟器上进行Xcode 9的debugging时,移动地图的时候可以达到90%,而且不会太差。 我猜我在这里得到20-30帧/秒。 (这可能是我在Xcode 8模拟器中获得的相同的fps。模拟器上的地图从来没有真正的光滑..)

在实际设备(iPhone 7,iOS 11)上运行时,CPU在不断移动地图时占用大约40%的时间,工作非常stream畅,完全没有滞后(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等)。

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