現在、Air for iOS を使用して iPad アプリケーションを開発していますが、アプリケーションがメモリを使いすぎていることが原因と思われるクラッシュが発生することがあります (iOS 5 の iPad1 のみ)。
アプリケーションでそのようなエラーをキャッチ/処理する方法は? メモリが少なくなったときに通知する方法は? flash.errors.MemoryError をキャッチしようとしてもうまくいかないようです。任意のヒント?
現在、Air for iOS を使用して iPad アプリケーションを開発していますが、アプリケーションがメモリを使いすぎていることが原因と思われるクラッシュが発生することがあります (iOS 5 の iPad1 のみ)。
アプリケーションでそのようなエラーをキャッチ/処理する方法は? メモリが少なくなったときに通知する方法は? flash.errors.MemoryError をキャッチしようとしてもうまくいかないようです。任意のヒント?
私はこの分野でいくつかの作業を行ってきました。ここにいくつかのヒントを紹介します。
Flash Builder 4.6 Premiumを入手してください。
プロファイラーのみの場合は入手してください。このようなことを診断するために利用できる最高のプロファイラーの 1 つがあります。そうは言っても、さまざまな程度の有用性を持つ他の Flash プロファイラーがあります。
これだけでも、未加工のメモリ使用量に関してメモリの大部分がどこに使用されているかを見つけて診断するのに役立ちますが、作成および破棄しているオブジェクトの数と、ガベージ コレクターが最終的に動き回る前にそれらがぶらぶらしている時間を見つけるのにも役立ちます。それらを手放すために。
より小さな単純なオブジェクトをプールする
小さなオブジェクトを常に作成して破棄するのではなく、オブジェクト プールを作成します。これにより、新しいオブジェクトを絶えずスピンアップするコストが節約され、メモリを解放する前にガベージ コレクターが実行されるまで待機する必要がなくなります。
actionscript でオブジェクト プールを作成するための例とパターンがたくさんあります。AS がジェネリックをサポートしていれば簡単ですが、それがなくてもかなり簡単です。
巨大なオブジェクトを熱心に処分する
これは、前のポイントのアドバイスに直接反しますが、巨大なオブジェクトの場合、それらをメモリ内に永久にぶら下げたくありません。私はBitmapData
、あなたがそれらを(予見可能な将来のために)使い終わったら、それらを壊して無効にし、ガベージコレクターにそれをクリーンアップさせるようなことを指しています。
それらが再び必要になったら、それらを再構築します。はい、わずかなパフォーマンス ヒットが発生しますが、モバイル デバイスのメモリは貴重であり、ロード画面にのみ表示される 2 MB 程度の bitmapdata オブジェクトを保持して無駄にしないでください。それを捨てる。
不要になった参照を無効にする
時間をかけて、ガベージ コレクターがその作業を行うために必要なものと、破棄できるオブジェクトと破棄できないオブジェクトを決定する方法を実際に理解するようにしてください。自己参照オブジェクト/循環参照を避けるようにしてください。CG は通常それを理解できますが、少し手を加える必要がある場合もあります。
使うたびに評価するnew
【2関連】
ここでもメモリ プロファイラーを使用するとこの手順に役立ちますが、新しいオブジェクトをインスタンス化するたびに、新しいオブジェクトをインスタンス化する必要があることを確認してください。PC 向けの開発では、新しいオブジェクトをプールに投入して CG に整理させるだけで簡単に怠惰になることがあります。小さい場合は、適切なキャッシング戦略 (オブジェクト プーリング、または単に参照キャッシング) があるかどうかを確認します。そして、頻繁に構築したり破棄したりする巨大なオブジェクトの場合は、より優れたアーキテクチャ ソリューションを考え出す時期かもしれません。
私の知る限り、iOS がメモリが少ないと判断した時点では、すでに手遅れです。前回チェックしたとき、フレームワークはメモリが不足していると判断したときに CG を実行しようとし、続行するのに十分なメモリを解放できない場合は失敗しました。スレッドを終了することが唯一の安全なオプションであるとオペレーティング システムが判断するような事態にならないように最善を尽くしてください。