4

最近、レンダリングの前に物理演算のレースを停止するのに問題がありました (それらは同じスレッド上にありました)。数か月後、新しいスレッドを作成して物理演算を入れることで、約 20 分で問題を解決しました。

それらを互いに完全に分離することで、はるかに優れた制御が可能になり、スプライトはすべてのフレームレートですべての画面を一貫して移動するようになりました。

私の質問は、ロジックとレンダリングを同じスレッドまたは別のスレッドに配置する方が「良い」ですか? 後者の方が良いように思えますが、問題はありますか? (たとえば、バッテリーの寿命に影響しますか?)

ありがとうございました

4

3 に答える 3

0

ええ、特に計算が簡単でない場合は、複数のスレッドを使用する方が間違いなく優れています。その場合、恐ろしい「アクティビティが応答しません」ダイアログが表示される可能性があります。

私が間違いなく調べたいのはAsyncTasks http://developer.android.com/reference/android/os/AsyncTask.htmlです。基本的に、doInBackgroundメソッド(バックグラウンドスレッドで実行されている)ですべての物理計算を実行し、その中から定期的に呼び出しpublishProgressます(UIスレッドですべてのレンダリングを実行する'onProgressUpdate'コールバックを実行します) )。

于 2013-02-14T18:32:16.357 に答える
0

あなたは言った...「私が理解しているように、レンダリングに別のスレッド(UIスレッドとは別)を使用するsurfaceViewを使用しているため、3つのスレッドがあります」

SurfaceView を拡張することで、UI スレッドとは別の、Surface の別の基になるスレッドが自動的に提供されると想定しているようです。私はそうではないと信じています。

SurfaceView の Android デベロッパー リファレンスから: 「このクラスの目的の 1 つは、セカンダリ スレッドが画面にレンダリングできるサーフェスを提供することです。」キーワードはcanです。別のスレッドを自分で作成する必要があります。SurfaceView を使用すると、別のスレッドでキャンバスに簡単に描画できます。

LunarLander を例にとると、2 つのスレッドしかありません。UI スレッドと、手動で生成された「LunarThread」で、物理が更新され、キャンバスが (SurfaceHolder.lockCanvas() を介して) 描画されます。 UI スレッドに関係なく、可能です。

于 2013-05-03T05:00:37.360 に答える
0

実際には、ロジックの実行と UI のレンダリングに異なるスレッドを使用することは、常に高く評価されています。また、それは正しいことでもあります。

しかし、マルチスレッドを処理/管理することは、プログラマーにとってより難しい責任です。

また、スレッドもバッテリー消費を増加させるため、スレッドは常に非常に慎重に使用する必要があります。

したがって、最終的な結果はスレッドを使用することですが、慎重に行ってください。糸は役に立つからこそ最適に使われますが、危険なものは慎重に使われません。

于 2013-02-14T18:23:06.427 に答える