GMSMapView 缓存的瓦片在缩放后保留在内存中,导致内存使用率高和 App 性能不佳

问题描述

在我的应用程序中,我展示了一个显示 GMSMapView 的 ViewController。在应用程序处于前台之前,ViewController 和 GMSMapView 都不应该被解除,因此 GMSMapView 对象永远不会被释放,而且由于我还显示了 GMSPanoramaView,两者都是非常昂贵的对象,因此我有一个表现与高内存使用率相关的问题。

应用启动后,当 GMSMapView 初始化时,内存使用量相对较低,完全符合我的应用要求。

问题是在我放大后出现的,我遇到了很高的内存增加,即使在我缩小之后也永远不会释放。我不确定,但在我看来,SDK 正在缓存某些内容并且从未被释放。 在下面的图像中(测试设备:iPhone XR),您可以清楚地看到问题,在我缩放时出现第一个峰值,从那时起,即使缩放级别回到 0,内存使用量也不会减少:

enter image description here

我正在尝试减少与缓存(?)相关的内存使用量,但我不知道如何实际做到这一点,甚至不知道是否有可能。 根据我对文档的理解,.clear() 方法仅影响标记和叠加层。我还注意到可能有用的 stopRendering() 方法,但它已被弃用。

顺便说一句,为了进行一些与 GMSMapView 相关的一般性能改进,我已经将 MapView 属性 .preferredFrameRate 设置为等于 .conservative 以降低渲染帧速率,并且还设置了 {{ 1}} 和 .isBuildingsEnabled = false 以避免无用的缓存。

我的问题是:使用 GoogleMaps SDK,是否可以在地图缩小后阻止上述缓存或释放内存?如果没有,我还能做些什么来减少与 GMSMapView 相关的高内存使用率?

编辑:这可能对其他人有用,因此我添加了更多 GoogleMaps SDK 优化技巧。我正在使用自定义地图样式,并且根据我的个人经验,我发现使用 Cloud-based Map Styling(目前处于测试阶段)在渲染地图图块方面比经典的 .isIndoorEnabled = false 方法要快一些。

解决方法

经过一番研究,我发现存在一个关于高内存使用率的未决问题:https://issuetracker.google.com/issues/35826246。 这是 6 年前开放的,不确定它是否会被解决,谷歌可耻。 除了指出问题并希望得到解决之外,别无他法。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...