ios - 如何停止 GMSMapView 渲染器?

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

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

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

enter image description here

调用自: CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION

(我想这就是谷歌地图的内部工作原理——它用一个运行循环注册一个 CADisplayLink 并在每一帧上重新渲染它)

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

enter image description here

请注意,在所选区域上,应用程序实际上没有发生任何事情,它仅显示静态 map 和表格 View (没有用户交互,没有框架更改,什么都没有)

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

enter image description here

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

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

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

最佳答案

stopRendering 的问题在于它将管理 map 状态的负担放在了开发人员身上。

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

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

  1. kGMSFrameRatePowerSave
  2. kGMSFrameRateConservative
  3. kGMSFrameRateMaximum

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

关于ios - 如何停止 GMSMapView 渲染器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53460181/

相关文章:

android - 谷歌地图 V2 支持设备

swift - 如何让我的谷歌地图始终跟随用户而不是让他们滚动离开

ios - NSTimer() 可以不停地运行吗? (Xcode v 7.0.1, Swift 2.0)

javascript - Google Maps V3 拖动标记并更新折线

java - 安装 Google Maps SDK Beta 3.1.0 时出错 Could not filnd :places-map-sdk-3. 1.0-beta:

ios - MKMapView init 在包含 Google Maps SDK 的应用程序中失败

ios - 无法让 UILabel 显示在 UIView 之上

ios - 在 iOS 中的 ARKit 1.0 中持久化 AR 数据

objective-c - UITextView 报告高度不正确

ios - react-native 添加新字体在 IOS 模拟器上给出 'Unrecognized font family'