11

私は Android >= 2.1 用のリアルタイム アーケード ゲームを書いています。ゲームプレイ中は、GC を誘惑しないようにメモリを割り当てません。GC が呼び出されると、プロセッサが 70 ~ 200 ミリ秒かかるためです。ユーザーはこれを「ああ、あのゲームは遅れている...」と見なします

LogCatをチェックしました。GC_FOR_MALLOC または GC_EXPLICIT がたくさんあります。しかし...私のプロセスのPIDからではありません! ゲームが原因ではありません。それらは、バックグラウンドで実行されている他のプロセスが原因で発生します。いくつかの壁紙、ウィジェット、ラジオ、電子メール、天気予報、その他のサービス...

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

Android <= 2.2 アーキテクチャの大きな欠陥ですか? Android 2.3では、時間のかかる同時 GC が導入されています。

ゲームをスムーズに実行するにはどうすればよいですか?

4

1 に答える 1

2

まず、LogCat で表示される内容は、デバイスによって異なります。GC がアプリからのものではないことが確実な場合、できることはまったくありません。GC が何かをしていることが常にわかります。コードをクリーンで非常に軽量に保つようにしてください。

さらに、一般的に言えば、ガベージ コレクターが存在する場合、手動で GC を呼び出すことは決して良い方法ではないことを覚えておいてください。GC は、独自のデバイスに任せたときに最適に機能するヒューリスティック アルゴリズムを中心に編成されています。GC を手動で呼び出すと、パフォーマンスが低下することがよくあります。

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

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

于 2013-03-22T13:25:50.873 に答える