GMSMapView:如何管理内存?

时间:2013-06-02 00:57:31

标签: google-maps-sdk-ios

我的应用在子视图中使用GMSMapView,内存使用情况如下:

  • 地图访问前1.25 MB;
  • 首次访问地图后的21.5 MB;
  • 放大和平移后30 MB(有时高于30)

据我所知,没有任何泄漏。问题是,我得到了内存警告,并经常关闭应用程序。显然,GoogleMaps正在使用应用程序内存中的大部分内容。我怎样才能在didReceiveMemoryWarning()中发布一些内容?

是否可以在应用中安装Google地图并管理其内存使用,至少足以防止其导致内存关闭?

这是GoogleMaps-iOS-1.3.0。

更新

我的记忆数据很少(使用Allocations Instrument而不是Activity Monitor)。以下是正确的值:

  • 地图访问前的8.8 MB
  • 第一次访问地图后的57 MB
  • 65 MB,尖峰接近80 MB。
  • 后缩放和平移

对于256 MB RAM设备(例如iPod Touch 4G)来说,这显然属于“故障”范围,并解释了内存警告和偶尔的故障。

是否有人在256 MB设备上的应用中成功运行Google地图?

4 个答案:

答案 0 :(得分:10)

尝试在视图控制器中使用此代码:

- (void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated] ;
    [m_mapView clear];
    [m_mapView stopRendering] ;
    [m_mapView removeFromSuperview] ;
    m_mapView = nil ;
}

我试过这个,它确实释放了一些GMSMapView内存。

答案 1 :(得分:6)

maps API使用大小为256 x 256像素的图块。它们以每像素32位纹理的形式加载到内存中,因此每个图块使用256 x 256 x 4 = 256kb。

如果你有一个1024 x 768的iPad,那么你需要4 x 3 = 12个瓷砖= 3MB。但是,只有当您的视图恰好与图块边界对齐时 - 实际上它才会跨越边界,因此您可能需要5 x 4 = 20个图块= 5 MB。

但是,如果缩小到几乎显示下一个较低缩放级别的点,则每个图块的绘制幅度将超过其全尺寸的一半,因此您需要10 x 8 = 80个图块= 20MB

然后,如果你有一个Retina设备,它实际上会加载下一个更高的缩放级别的图块,因此每个维度需要两倍的数量(以匹配屏幕的像素而不是点),因此你需要20 x 16 = 320个瓷砖= 80MB。

iPhone 5的类似计算可以达到240个平铺= 60MB。

因此,如果你计算地图仅需要用于内存的内存量,不计算用于内部处理的任何开销或其他内存,那么它可以解决很多问题。所以你可能无能为力。当存在内存压力时,地图SDK已经释放了未使用的图块 - 但是它无法释放渲染当前视图所需的图块。

这意味着您唯一的选择可能是减少自己代码中的内存使用量。

对于我的应用程序,我不得不改变它在iPad 1上的工作方式,因为它耗尽内存并且经常崩溃。对于其他设备,我发现它工作正常。

可能的解决方法的一些想法可能是减小地图视图的大小,或者将缩放级别捕捉到整数值。这对用户来说都不是很好,但它们可能有助于避免崩溃。

答案 2 :(得分:0)

我也被GMSMapview使用的巨大内存所困扰。这是谷歌地图sdk中的严重问题,我认为谷歌团队正在研究它。 他们还修复了1.9.0版中的一些内存回收问题 其他减少记忆的方法 -

  1. 尽可能减小GMSMapView的大小

  2. 使用最新版本1.9.0 - 截至2014年10月。

  3. 使用以下链接下载最新的sdk -

    https://developers.google.com/maps/documentation/ios/releases

答案 3 :(得分:0)

在我的情况下,我在两个View Controller中背对背拥有两个mapView,因此我弹出View Controller并从超级视图中删除地图视图。

override func onBtnBack() {
        self.navigationController?.popViewController(animated: true)
        self.mapView.removeFromSuperview()
}