如何停止GMSMapView渲染器?

时间:2018-11-24 16:32:58

标签: ios google-maps google-maps-sdk-ios

在将GMSMapView用作视图层次结构的一部分时,我注意到了性能问题。重要说明:该地图不会占据整个屏幕,它用作表格视图标题。这些问题会影响表格视图本身的行为-低FPS,这会导致不良的用户体验,因此,我试图解决这些问题,或者至少了解GMSMapView的功能。

使用Time Profiler,我发现这是由GMSMapView在每帧上重新渲染(如我所知)造成的,因为主线程上最重的堆栈跟踪是:

enter image description here

哪个叫: - (void) stopRendering

(我想这就是Google Maps内部的工作方式-它向运行循环注册一个CADisplayLink并在每帧上重新渲染它)

这会导致CPU使用率过高(高达99%):

enter image description here

请注意,在所选区域上,应用程序实际上什么都没有发生,它只显示静态地图和表格视图(无用户交互,无框架变化,无任何东西)

如果我在没有GMSMapView作为子视图的情况下进行了相同的测试,则同一位置的CPU使用率几乎为0%:

enter image description here

现在问这个问题。 为什么会发生这种情况以及如何停止这种行为?

我在GMSMapView上找到了一个名为{{1}}的方法,并对其进行了测试-结果很好,并且性能与完全删除地图视图时相同。但是,此方法被标记为已弃用,并且指出它将在以后的SDK版本中删除,这使其成为长期解决方案的不佳选择。

任何帮助,解释或线索将不胜感激!

1 个答案:

答案 0 :(得分:3)

stopRendering的问题在于,它将开发图状态的管理负担加到了开发人员上。

您应该限制对象的帧速率,而不是使用stopRendering。 GMSMapView具有一个名为preferredFrameRate的属性。您应该使用它。它在文档中说默认情况下,preferredFrameRate设置为最大值,或重新渲染每个帧。

preferredFrameRate是一个名为GMSFrameRate的枚举。值:

  1. kGMSFrameRatePowerSave
  2. kGMSFrameRateConservative
  3. kGMSFrameRateMaximum

您应该使用#2来确保地图在用户交互过程中保持流畅,但也不会不必要地渲染。默认情况下,preferredFrameRate设置为#3。