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