2012-06-27 6 views
7

OpenGLでオブジェクトをレンダリングしていて、ほとんどの状況で60fpsの素敵な滑らかなフレームレートが得られました。 私はバックグラウンドスレッドで何か重いことをやっています。これは、REST APIからのものを取り出して処理し、グラフにオブジェクトを追加することです(優先度の低いもの、UIの流動性が気になります)。レンダラは非常に長い時間、1秒まで(バックグラウンドスレッドが実行されている間)、一時停止し、何も起こらなかったかのように再開します。これはアニメーションが同時に開始されていることに気付きました。この間、アニメーションが止まってしまいました。バックグラウンドスレッドは最小優先度に設定されており、ガベージコレクションは100〜200ミリ秒を要しますが、全体ではありません。バックグラウンドタスクのどこにでもデバッグポイントを設定すると、レンダリングは遅れずにきれいに続きます。Android:OpenGLレンダリングは、重いバックグラウンドタスクが実行されているときに一時停止します

重いバックグラウンドスレッドがOpenGLスレッドを飢えさせる可能性はありますか?もしそうなら、私は何ができますか?

+0

どのGPUでテストしていますか? –

+0

[this performance trace](http://stackoverflow.com/q/9612959/1262542)のように疑わしい... –

+0

ダンノー何GPU、それはギャラクシーネクサスです。家に帰ると、シミュレータでテストするつもりです。 – manmal

答えて

1

もちろん! GPUにデータを供給する必要があります。これはCPUによって行われます。したがって、I/OやCPU処理のようなシステムのボトルネックがあれば、GPUには給電できません。たとえば、アニメーションは伝統的にCPU上で実行されます。このため、同じグラフィックチップで異なるCPUを使用して、より高いフレームレートをPCで得るゲームがたくさんあるのです。

また、プロファイリングは非常に良いアイデアです。可能であれば、実際にREST呼び出しか、REST呼び出しが多くのものの1つであることを確認するためにプロファイリングすることをお勧めします。

私はREST処理について気付いた事がありました。 RESTでは多くの文字列が処理されることがあり、StringBuilderを使用しないと、多くのガベージコレクションが終了します。しかし、あなたがこれを得ているようには聞こえません。

+1

スケジューラはなぜGPUパイプを供給する前にバックグラウンドスレッドを置くべきですか?それは意味をなさない。そうであれば、なぜGoogleのエンジニアはそのレンダリングスレッドに高い優先度を与えるだけではないのですか? – manmal

+0

時々JavaがRAMを解放しなければならない、特にストリング処理のビットを行う傾向のあるREST呼び出しの場合 –

+1

GCの一時停止はほぼ同じではないため、ここではガベージコレクションは問題ではないとすでに言及しました長いです。彼らは1.5秒ではなく、最大で100〜200msに似ています。 – manmal

関連する問題