2013-03-17 9 views
11

私はAndroid> = 2.1のリアルタイムアーケードゲームを書いています。ゲームプレイ中に私はGCを誘惑しないためにメモリを割り当てません。 GCが起動すると、Beacuseは70〜200msの間プロセッサを使用します。ユーザーはこれをと表示します。「ああ、そのゲームは遅れています...」他のプロセスは私のゲームを遅くするGCを呼び出します

LogCatをチェックしました。 GC_FOR_MALLOCまたはGC_EXPLICITがたくさんあります。しかし...私のプロセスのPIDからではありません!私のゲームはそれらを引き起こしていません。それらはバックグラウンドで実行されている他のプロセスによって引き起こされます。いくつかの壁紙、ウィジェット、ラジオ、電子メール、天気検査などのサービス...

私はそれを完全に理解していません。たとえば、壁紙が消えてonPause()が呼び出されると、私は思います。だから、すべてのスレッドを停止し、確実にメモリを割り当てないでください(またはSystem.gc()を呼び出してください)。多分それは間違って実装されていますか?知りません。しかし、時にはGCを引き起こしているAndroidサービスもあります...それは奇妙です。

大きなAndroidですか?< = 2.2アーキテクチャの欠陥ですか? Android 2.3 introduces並行GCです。時間がかかりません。

私のゲームがスムーズに動作するようにするにはどうすればよいですか?

答えて

2

まず、LogCatに表示される内容はデバイスごとに異なります。 GCがあなたのアプリから来ていないと確信しているなら、あなたは何もできません。あなたはいつもGCがやっていることを見つけるでしょう。 コードをきれいにして、非常に軽くしておいてください。

ガーベッジコレクタが存在する場合は、GCを手動で呼び出すことをお勧めしません。 GCはヒューリスティックアルゴリズムを中心に構成されています。 GCを手動で呼び出すと、パフォーマンスが低下することがよくあります。

比較的まれな状況では、特定のGCが間違っていることがあります.GCを手動で呼び出すと、パフォーマンスが向上します。これは、すべての場合に最適にメモリを管理する「完全な」GCを実装することは実際には不可能であるためです。このような状況は予測が難しく、多くの微妙な実装の詳細に依存します。 「良い習慣」は、GCを単独で実行させることです。 GCへの手動呼び出しは例外であり、実際のパフォーマンスの問題が正式に目撃された後でのみ想定されるべきです。

私はそれがAndroidの欠陥であるとは思わない< = 2.2。それはより高いバージョンで起こっていますか?あなたはそれをテストしましたか?

+0

なぜあなたは信じられないのですか?はい、私は2.2と4.1でそれをテストしました。 2.2の動作は、私が説明したようなものです。 4.1では、私が言及したように、この問題をあまり厳しくしない同時GCがあります。 –

関連する問題