14

私のアプリはサブビューで GMSMapView を使用しており、メモリ使用量は次のとおりです。

  • マップ アクセスの前に 1.25 MB。
  • 最初のマップ アクセス後は 21.5 MB。
  • ズームインとパン後は 30 MB (場合によっては 30 MB を超えることもあります)

インストルメントでわかる限り、漏れはありません。問題は、メモリの警告が表示され、多くの場合アプリがシャットダウンすることです。明らかに、GoogleMaps はアプリのメモリの大部分を使用しています。didReceiveMemoryWarning() でその一部を解放するにはどうすればよいですか?

アプリで Google マップを使用してメモリの使用を管理することは可能ですか? 少なくともメモリのシャットダウンを防ぐのに十分ですか?

これは GoogleMaps-iOS-1.3.0 です。

アップデート:

私のメモリ数値はかなりずれていました (Activity Monitor の代わりに Allocations Instrument を使用していました)。正しい値は次のとおりです。

  • マップアクセス前に8.8MB
  • 最初のマップ アクセス後は 57 MB
  • 65 MB、80 MB 付近で急上昇。ズームとパン後

これは明らかに 256 MB の RAM デバイス (iPod Touch 4G など) の「問題」の範囲内にあり、メモリの警告と時折発生するキックについて説明しています。

256 MB のデバイスのアプリで Google マップを正常に実行している人はいますか?

4

4 に答える 4

11

ビュー コントローラで次のコードを使用してみてください。

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

これを試したところ、GMSMapViewメモリが解放されました。

于 2013-11-13T09:42:15.727 に答える
7

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 タイル = 5MB が必要になります。

ただし、次に低いズーム レベルが表示されるポイントまでズームアウトすると、各タイルはフル サイズの半分強で描画されるため、10 x 8 = 80 タイル = 20MB が必要になります。

次に、Retina デバイスを使用している場合、実際には次に高いズーム レベルのタイルが読み込まれるため、(ポイントではなく画面のピクセルに一致させるために) 各次元で 2 倍の数のタイルが必要になるため、20 x 16 = 320 個のタイルが必要になります。 = 80MB。

同様に iPhone 5 を計算すると、240 タイル = 60MB になります。

そのため、内部処理に使用されるオーバーヘッドやその他のメモリを考慮せずに、マップがタイルのために必要とするメモリの量を計算すると、かなりの量になります。だから、あなたにできることは何もないのかもしれません。マップ SDK は、メモリ不足がある場合に未使用のタイルを解放しますが、現在のビューをレンダリングするために必要なタイルを解放することはできません。

つまり、唯一のオプションは、独自のコードでメモリ使用量を削減することです。

私のアプリでは、iPad 1 での動作方法を変更する必要がありました。これは、メモリが不足し、頻繁にクラッシュしていたためです。他のデバイスでは、問題なく動作することがわかりました。

考えられる回避策として、マップ ビューのサイズを縮小するか、ズーム レベルを整数値にスナップすることが考えられます。どちらもユーザーにとっては良いことではありませんが、クラッシュを回避するのに役立つ可能性があります。

于 2013-06-04T02:34:35.100 に答える