2013-06-02 13 views
12

マイアプリはサブビューでGMSMapViewを使用しており、次のようにメモリ使用量は次のとおりです。マップアクセスする前にGMSMapView:メモリを管理する方法は?

  • 1.25メガバイト。
  • 最初のマップアクセス後の21.5 MB。
  • 30メガバイト(そして時には30上にスパイク)限り私は楽器と言うことができるように、中にズームや

ませリークをパンなかった後。問題は、私はメモリの警告と、多くの場合、アプリケーションのシャットダウンを取得しています。明らかに、GoogleMapsはアプリのメモリのシェアを使用しています。 didReceiveMemoryWarning()の中で、どうやってそれを解放することができますか?

アプリでGoogleマップを使用し、少なくともメモリシャットダウンを防ぐのに十分なほどのメモリ使用量を管理できますか?

これはGoogleMaps-iOS-1.3.0です。

更新:

私の記憶の数字は遠く離れていた(割り当てインストゥルメントの代わりに、アクティビティモニタを使用していました)。マップアクセスの前に

  • 8.8メガバイト80メガバイト近くのスパイクとの最初のマップにアクセスした後
  • 57メガバイト
  • 65メガバイト、:ここでは正しい値です。ズームやパンの後で

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

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

+0

地図が画面に表示されていないときにstopRenderingを呼び出すようにしてください。これにより、メモリリソースが解放されます。 – Felix

+0

しかし、ユーザーがスクロールしてズームしているときに何をすべきか、また警告が来る(そして時にはシャットダウンする)のですか?つまり、レンダリングを停止する機会はありません.Basicallyでは、GMSMapにメモリ破産を起こさせるだけですか? :-) – user2444264

+1

@ user2444264私は同じ解決策を見つけましたか?私は同じ問題に直面しています –

答えて

6

マップAPIは、サイズが256 x 256ピクセルのタイルを使用します。これらは32ビット/ピクセルのテクスチャとしてメモリにロードされるため、タイルあたり256 x 256 x 4 = 256kbを使用します。

iPadが1024 x 768の場合、4 x 3 = 12タイル= 3MBが必要です。しかし、これはあなたのビューがタイルの境界に完全に揃っている場合に限られます。実際には境界を越えますので、おそらく5 x 4 = 20タイル= 5MBが必要になります。

ズームレベルを次の低いレベルに表示すると、各タイルはフルサイズの半分を超えて描画されるため、10 x 8 = 80タイル= 20MB。

Retinaデバイスを使用している場合、実際には次のズームレベルのタイルが読み込まれるため、各ディメンションの2倍のサイズが必要になります(画面のピクセルがポイントではない) 16 = 320タイル= 80MB。

iPhone 5の同様の計算は240タイル= 60MBになります。

タイルのためだけに地図に必要なメモリの量を計算し、内部処理に使用されるオーバーヘッドやその他のメモリを数えない場合は、非常に多くなります。おそらくあなたがすることはできません。マップのSDKは、メモリ使用量がある場合には未使用のタイルを解放しますが、現在のビューをレンダリングするのに必要なタイルを解放することはできません。

つまり、自分のコードでメモリ使用量を減らすことができるということです。

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

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

+1

その詳細な回答ありがとうございます。 「メモリ圧迫があると、マップSDKは既に未使用のタイルを解放しています」と言います。私はメモリの警告に応答してメモリ使用量が低下することはありません。私はこれを(256 MB RAM)のiPod Touch 4Gでテストしていますが、画面サイズを小さくしない限り、それができないとあなたは正しいと思います。 – user2444264

+0

確かに知るのは難しいですが、私のアプリではできるだけ多くのメモリを解放してメモリの警告を処理しますが、可能であればSDKがタイルを解放していないと、私のアプリケーションは非常に定期的にクラッシュするでしょう:)可能な限りタイルを解放していると仮定しますが、どれだけ遠くまで行くことができるかには限界があります。 –

4

あなたのビューコントローラでこのコードを使用してみてください:

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

私はこれを試してみましたが、それはいくつかGMSMapViewメモリを解放しません。

+0

それは私のために働きます..thanks –

+0

私はObj-Cに精通していないので私はSwiftを使用しますが、私はviewWillDisappearではなくdeinit関数でこれを呼び出すことを提案します。 – Rogoon

+0

@Rogoon私はSwiftにあまり慣れていませんが、 'viewWillDisappear()'はObj-Cとまったく同じ方法で使用されているので、別の場所に置く必要はありません。 – turingtested

0

また、GMSMapviewで使用される膨大なメモリが詰まっています。これはGoogleマップ内の深刻な問題ですsdkと私はそれに取り組んでいるGoogleのチームだと思う。できるだけ小さな

  • として 彼らはまた、バージョン

    1. バイ・メモリを削減する1.9.0 他の方法でいくつかのメモリの再利用の問題を修正GMSMapViewのサイズを縮小

      使用最新バージョン1.9.0 - など10月に2014年

    使用次のリンクはsdk-

    最新ダウンロードします