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