2

こんにちは。

私は、通常の60 fpsでループし、さまざまな不思議なことを行うAndroid用の小さなopenGLベースのアプリを作成しています。

私は自分のフレームレートを監視し、可能な限り最適化しようとしています。私は最近、私のプログラムが実行されている間、時々わずかな一時停止があることに気づきました。ガベージコレクターが実行されていて、LogCatを調べているのではないかとすぐに疑ったのですが、fpsのディップの前後にいくつかの疑わしいGCが表示されていました。

ただし、収集を引き起こしているのが私のアプリであるかどうかはわかりません。

それで、これらはGCについての私の質問です:

1)LogCatからログを取得すると、PID(プロセスID?)が含まれます。これは、私が受け取る典型的なGCの例です。

12-14 14:52:40.647: DEBUG/dalvikvm(492): GC_EXPLICIT freed 3831 objects / 203576 bytes in 32ms

492はPIDです。このPIDは、GCを実行するプロセスのものになりますか?それとも、GCを必要としているのは電話で実行されているプロセスですか?

たとえば、同じセッションからのLog.debugを使用したアプリからのログは次のとおりです。

12-14 13:50:42.717: DEBUG/Curve(2298): LIFECYCLE - OnStart

私のアプリのPIDは492​​ではなく2298です。これは、GCが私のアプリによるものではなかったことを意味しますか?

割り当てトラッカーを使用すると、発生する割り当てはほとんどありません。数行のロギングにより、いくつかの文字列が生成され、ユーザーが押すと時々Rectが生成されます(これを修正したので、今は1回だけ割り当てられます...)したがって、アプリ自体がどのように生成されるかわかりません。 GCの必要性。

2)それが私のアプリの割り当てではなく、単にメモリに食い込んでいる他のプロセスである場合、それは私のアプリにまったく影響を与えるべきですか?

3)私がddmsを使用しているという事実自体が、GCを引き起こしている可能性がありますか?

4)割り当てトラッカーを調べると、実行中/自分自身で実行しているコードに由来しないエントリがいくつかあります。そのうちの1つはスレッドの統計に関連していましたが、これはddmsでしょうか?

これが本当にいくつかの質問である場合は申し訳ありませんが、Logcatに表示されるGCログが実際にアプリケーションからのものであるかどうかにすべて関係しています。

現時点では、電話が座っていてアプリが実行されておらず、まだ小さなGCが5〜15秒かかっていることを念頭に置いてください。これらは通常33ミリ秒間実行され、非常に少量のメモリのようです。だから、これは彼らが私のせいではないことを意味すると思います。-ここでも基本的にPIDとそれが示すものについてです。

4

1 に答える 1

3

あなたは1)で正しいです。Logcatを使用するGCログのサブセットのみがアプリに属し、それらにはアプリのpidがあります。

ほとんどの場合、問題はバックグラウンドサービスが小さな割り当てを要求していることが原因です。ゲームのフレーム間のデルタ時間にローパスフィルターを適用するか、全体的にスムーズなエクスペリエンスを実現するために最大FPSを制限することをお勧めします。iOSでも、最終的に問題が発生することなくゲームを60FPSで実行することは非常に困難です。

于 2010-12-14T16:48:05.753 に答える