3

Android上のJavaを使用してopenGLES2ゲームを構築しています。

現在、2つのスレッドがあります。AndroidUIとopenGL。

私が理解している限り、最高のパフォーマンスを得るには、ゲームロジック用に別のスレッドが必要です。これにより、openGLスレッドが可能な限り高速にレンダリングできるようになります。

これで3が残ります。AndroidUI、openGL、およびゲームロジック。(それらをUI、OGL、およびGLと呼びましょう。)

私が間違っている場合は私を訂正してください:

UIが起動し、OGL、およびGLが作成されます。OGLとGLが実行され、UIに入力を照会します。GLは、描画呼び出しをOGLのキューに送信します。

ここには2つのケースがあります。GLがOGLよりもループに時間がかかる場合、最後のフレームの呼び出しの半分だけをレンダリングしないように、OGLの次のループはGLが終了するのを待ってから次のループを開始する必要があります。OGLがGLよりも時間がかかる場合、GLは、OGLが完了するまで待機して、再度開始するか、さらに描画呼び出しを送信する必要があります。

これを達成するには:

GLがループを完了すると、OGLをチェックして、描画呼び出しの現在のキューの描画が完了したかどうかを確認します。その場合、GLとOGLの次のループの両方を開始します。そうでない場合は、待機します。

OGLが実行されると、GLがチェックされます。GLが完了すると、両方のループが再開されます。そうでない場合は、GLを待機します。GLが完了すると、OGLがチェックされ、両方が再開されます。

これが少し紛らわしい言葉であるならば申し訳ありません。

私の考えを説明するために:

図http://img840.imageshack.us/img840/2816/stackoverflowthredpictu.jpg

私の質問を明確にするために:-このように物事をレイアウトすることは機能しますか?-そうでない場合、何がうまくいくでしょうか?

-これを達成するために、どのような特定の主題を調べる必要がありますか?--つまり、スレッドを作成したり、スレッド間で情報を送信したりする方法がわかりません。

ここで質問するのはこれが初めてです。正しく質問したことを願っています。:) ありがとう!

4

1 に答える 1

0

――このように並べるとうまくいきますか?--そうでない場合、何がうまくいきますか?

はい。ただし、この戦略は必要以上に複雑になる可能性があります。2 つのスレッドが互いに待機しなければならない場合、2 つのスレッドをデッドロックするのは簡単です。

私はあなたが使用できると思いますRENDERMODE_WHEN_DIRTY

 setRenderMode(RENDERMODE_WHEN_DIRTY);

そのモードでは、(1) サーフェスが作成されたとき、または (2) が呼び出されたときにのみ、レンダラーがフレームをレンダリングしますrequestRender()。そのため、ゲーム ロジック スレッドはqueueEvent()(または同様の) 呼び出しを呼び出して描画呼び出しをレンダラーにプッシュしrequestRender()、ゲーム ロジック ループの最後で呼び出します。

それでもゲーム ロジック スレッドがレンダラーの終了を待つ必要があることがわかった場合は、ゲーム ロジック スレッドで を作成しSemaphore、レンダラーが ( を呼び出しrelease()Semaphore) フレームのレンダリングが終了したことを通知するまでスレッドをブロックすることができます。

免責事項: 私はゲーム開発者ではありませんが、これが探索への道筋を提供してくれることを願っています。

于 2012-11-03T23:50:25.257 に答える