1

Android と OpenGL 2.0 を使用して、一種の砂漠のレース ゲームを作成しようとしています。少なくともそれが最終目標です。当面は、パーリン ノイズ アルゴリズムを使用して、無限の砂漠を生成する作業を行っています。ただし、並行性と同期に関して多くの問題に遭遇しています。このプログラムは 3 つのスレッドで構成されています。「レンダリング」スレッド、基本的にバックグラウンドでパーリン ノイズのタイルを生成する「ジオメトリ」スレッド (最終的にそれらをレンダリング スレッドに送信して独自の時間で処理する)、「メイン」スレッドです。新しいパーリン ノイズ タイルを作成する必要がある場合、カメラの位置を更新し、ジオメトリ スレッドを更新するスレッド。

前述のパーリン タイルは VBO に保存され、カメラから特定の距離内にある場合にのみレンダリングされます。バッファの初期化は常にすぐに開始されます。

これはすべてうまく機能し、目立った問題はありません。

でも。

タイルが glBufferData() を介して GPU にアップロードされると (別のジオメトリ スレッドによる処理後)、レンダリング スレッドが常にブロックされているように見えます。これは、スクリーン バッファがレンダリングされる前に、Android が暗黙的に glFinish() を呼び出すためだと思います。明らかに、他のすべてが描画されている間にデータのアップロードをバックグラウンドで実行したいと考えています。必要に応じて、複数のフレームにわたって実行することもできます。

Google で調べたところ、glMapBuffer/glMapBufferRange() を使用することが唯一の解決策でしたが、これら 2 つの方法は GLES2.0 ではサポートされていません。glFenceSyncなどの同期オブジェクトもそうではありません...

....

助けはありますか?

PS問題は私にとってより理論的なように見えるため、コードは必要ないと思ったため、コードを提供していません。しかし、私は確かに要求に応じていくつかを生産することができます.

これまでのゲームのスクリーンショット: http://i.stack.imgur.com/Q6S0k.png

4

1 に答える 1

0

Android は glFinish() を呼び出しません (glFinish() は実際には IMG の GPU ではノーオペレーションです)。問題は、glBufferData() が非同期 API ではないことです。本当に必要なのは、OpenGL ES 3.0 でのみ利用可能で、非同期コピー (テクスチャのアップロードを含む) を実行する機能を提供する PBO です。

常に glBufferData() を使用していますか? 毎回 VBO を再割り当てしないように、可能な限り glBufferSubData() を使用する必要があります。

于 2013-06-12T17:38:36.463 に答える