【问题标题】:How to stop GMSMapView renderer?如何停止 GMSMapView 渲染器?
【发布时间】:2018-11-24 16:32:58
【问题描述】:

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

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

从以下位置调用: CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION

(我猜这就是 Google 地图的内部工作方式——它使用 runloop 注册一个 CADisplayLink 并在每一帧上重新渲染它)

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

请注意,在所选区域上,应用程序并没有真正发生任何事情,它只是显示一个静态地图和一个表格视图(没有用户交互,没有框架更改,没有任何东西)

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

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

我在 GMSMapView 上找到了一个名为 - (void) stopRendering 的方法,并对其进行了测试 - 结果很好,并且我获得了与完全删除地图视图时相同的性能。但是,此方法被标记为已弃用,并声明它将在 SDK 的未来版本中删除,这使其不适合长期解决方案。

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

【问题讨论】:

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


    【解决方案1】:

    stopRendering 的问题在于它将管理地图状态的负担交给了开发人员。

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

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

    1. kGMSFrameRatePowerSave
    2. kGMSFrameRateConservative
    3. kGMSFrameRateMaximum

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-26
      • 2013-08-24
      • 2014-07-09
      • 1970-01-01
      • 1970-01-01
      • 2015-08-13
      • 2011-11-27
      相关资源
      最近更新 更多