9

私はこのAndroidゲームをJavaで作成しています。私はかなりの数の画像を持っていますが、一度にすべてを使用する必要はないので、使用中のビットマップを処理するResourceMangerクラスを作成しました。ただし、メモリからビットマップをクリアするのは非常に遅いことがわかりました。私は現在このようなことをしています:

bitmap.recycle()
bitmap = null

System.gc (also tried Runtime.getRuntime().gc())

まず、メモリからビットマップをすばやくアンロードする方法はありますか、それともロード画面をそれに依存させることができるように、実際にクリアされているかどうかを何らかの方法で確認することは可能ですか?

4

2 に答える 2

1

System.gc()を試行したときに、ガベージコレクターが実際に実行されるという保証はありません。これは、gc()がリソースの不足などの特定の前提条件を予期しているためです。したがって、gc()の呼び出しが重要なCPUサイクルを浪費していることは明らかです。開発者として、参照を無効にすることで、gcの不要なオブジェクトを収集可能にすることができます。

ゲームシステム(ゲーム)を作成する際に役立つ最適化手法がいくつかあります。

  1. テクスチャを使用します。これがです。

  2. SpriteとSpriteSheetsを使用します(個々のビットマップをロードするよりもシステムへのオーバーヘッドが少なくなります)。これを使用する多くのオープンソースゲームエンジンがあります。それらを使用したくない場合は、これらのソースから最初から作成する方法を理解してください。

  3. 大きなビットマップを効率的にロードし、ビットマップをより適切に使用するためにビットマップ をキャッシュする方法については、これらの標準のAndroidドキュメントを使用してください。アイデアは、ユーザーのデバイスが処理量を処理するのに十分効率的でない場合、および/またはゲームのメモリが少ない場合は、いつでもビットマップを縮小できます(より良い応答のために品質を妥協します)。

  4. 常にメモリリークの問題に対してアプリをテストしてください。これが役立つ素敵な投稿です。

  5. 同じシーンでゲーム内で複数回使用されるInMemory(一度使用するとリリースしない)アイテムを保持します。その理由は、画像をメモリにロードするのに時間がかかるためです。

これがお役に立てば幸いです。

于 2012-12-21T06:48:26.720 に答える
0

SylvainL が言ったように、System.gc とその仲間は完全なガベージを収集するため、非常に遅くなる可能性があります。Java マシンは定期的に GC を実行し、特定の時点で利用可能な空きメモリの量に応じて周期が微調整されます。

私にとって最良の選択は、ある種のビットマップ プーリングを使用することです。プールから取得してプールに解放できる一連のプレハブ Bitmap インスタンスを用意し、LRU ポリシーを適用するキャッシュで Buffer インスタンスを管理します。

適切に微調整することで、Bitmap インスタンスがプールされているときに作成および破棄するコストをゼロにすることができます。また、ビットマップ データを含む Buffer インスタンスは、使用状況に応じてメモリに動的にロードおよびメモリからアンロードされます。

于 2012-12-21T01:20:27.183 に答える