【发布时间】: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