2011-05-14 9 views
3

アンドロイド電話のアプリケーションを構築していて、妙な「スロットリング」を経験しています。私はそれがアプリケーション内の何か他のものを処理するために何をしているのかをセマフォーが止めるために呼び出されているためだと思います。私は肯定的ではないが。FPSスロットル(?) - 電話のアップデート/ドローサイクルをスムーズにする?

これらのブレークアウトを広げる方法があるかどうか、またはアプリケーションが話す時間の遅れがほとんどないことをユーザーに見せにくくする方法があるのか​​どうか不思議です。

編集:私が現在実行しているものは、画像の2次元配列です - インスタンス化された〜8000の時点で約80だけが描画されます。彼らの色合いがRGB0(ピッチ黒)でない場合にのみ描画されます。アップデートのランタイムループは、どの画像がプレーヤーに最も近いかをチェックし、RGB 0.2fの基本的な最小点灯を与えます。それ以外の基本的なイベントハンドラや動き/ビューポートループは更新されています。私はLibgdxフレームワークを使用していますが、アンドロイドネイティブではありません。だからOpenGLなど

編集:私はあなたがそれがそうだと思うものではないことに注意したいと思います。私は約3800回のレンダリングを行っていましたが、「送信」だけではなく、新しいVector2を宣言し、そのようにパラメータを送信しました。ガーバッジ・コレクターはこの攻撃を嫌うことはありません。私はちょうど2フロートを送信しているので、スムーズに実行されます。私の悪い._。

答えて

4

複数のアクティブなプロセスが同時に実行されていない限り、これは起こりません。

ガベージコレクタは、あまりにも多くの問題を抱えています(コードは表示されません)。ループ内でオブジェクトを初期化していますか?もしそうなら、代わりにオブジェクトを再利用できますか?

オブジェクトは、特にビューです。ビューを再利用し、新しいビューを作成しないようにしてください。

考慮すべきもう1つのポイントは、フルレイアウトの再描画です。すべての代わりに画面の一部を再描画できますか? (つまり、view.invalidate();とは対照的にview.invalidate(rect);を使用してください)

最後に、のレイアウトが深すぎますですか?できるだけフラットにしてください。たとえば、LinearLayoutsの代わりにRelativeLayoutを使用します。

時間をかけてこのビデオをご覧ください:Romain Guy's Google I/O 2009 talk。そこから得る情報がたくさんあります。

の更新後、私は描画する8Kのイメージがあることがわかります。それらのすべてをインスタンシエートすると、メモリには他のもののための余裕がほとんどないため、GCはできる限り何かを連続的に収集する必要があります。それはシステム全体を遅くすることを意味します。同じビデオでQ & Aを約53-55分でチェックしてください。あなたのような状況では、ソフトリファレンスのHashMapにビットマップへの参照をすべて入れるように提案しているので、GCは必要に応じて未使用のイメージを収集することができます。それは他のものの収集を妨げるでしょう。 私はまた、必要に応じて、最初にすべてを行うのではなく、バッチでインスタンス化します。

+0

過去の初期化は何も作成されていません。すでに配置されているものを使用するだけです。あまりにも多くのメソッドレベル変数 - 奇数intまたはString - がそれを減速させるのであれば?あまりにも多くのギャップを生じさせるには十分だとは思っていませんが。 – Remm

+0

@Remm intsが問題になる可能性があるとは思えません。私は少し答えを広げます。 – Aleadam

+0

残念ながら、レイアウトの要素は多かれ少なかれ適用されません。共有メモリのようにビューについて話していますか?現在共有メモリを使用していません。ビデオの場合は+1、私は間違いなくそれを見てください – Remm

0

UI描画/更新で遅延が発生した場合、UIスレッドで長時間実行されていたプロセス(ネットワーク、データベース、メディア、ビットマップデコード)を実行している可能性があります。

background threadで長時間実行するタスクを実行する必要があります。それにはAsyncTaskを使用してください。

関連する問題