在将GMSMapView用作视图层次结构的一部分时,我注意到了性能问题。重要说明:该地图不会占据整个屏幕,它用作表格视图标题。这些问题会影响表格视图本身的行为-低FPS,这会导致不良的用户体验,因此,我试图解决这些问题,或者至少了解GMSMapView的功能。
使用Time Profiler,我发现这是由GMSMapView在每帧上重新渲染(如我所知)造成的,因为主线程上最重的堆栈跟踪是:
哪个叫:
- (void) stopRendering
(我想这就是Google Maps内部的工作方式-它向运行循环注册一个CADisplayLink并在每帧上重新渲染它)
这会导致CPU使用率过高(高达99%):
请注意,在所选区域上,应用程序实际上什么都没有发生,它只显示静态地图和表格视图(无用户交互,无框架变化,无任何东西)
如果我在没有GMSMapView作为子视图的情况下进行了相同的测试,则同一位置的CPU使用率几乎为0%:
现在问这个问题。 为什么会发生这种情况以及如何停止这种行为?
我在GMSMapView上找到了一个名为{{1}}的方法,并对其进行了测试-结果很好,并且性能与完全删除地图视图时相同。但是,此方法被标记为已弃用,并且指出它将在以后的SDK版本中删除,这使其成为长期解决方案的不佳选择。
任何帮助,解释或线索将不胜感激!
答案 0 :(得分:3)
stopRendering的问题在于,它将开发图状态的管理负担加到了开发人员上。
您应该限制对象的帧速率,而不是使用stopRendering。 GMSMapView具有一个名为preferredFrameRate的属性。您应该使用它。它在文档中说默认情况下,preferredFrameRate设置为最大值,或重新渲染每个帧。
preferredFrameRate是一个名为GMSFrameRate的枚举。值:
您应该使用#2来确保地图在用户交互过程中保持流畅,但也不会不必要地渲染。默认情况下,preferredFrameRate设置为#3。