2010-11-28 4 views
0

現在、私は、Androidで、Replica Islandからインスパイアされたデザインを使用してゲームを書いています。つまり、デュアルスレッドアプローチ、1つのロジックスレッド、1つのレンダースレッドです。Androidの並行レンダリングデザイン

これは、基本的にはレンダリング可能なゲームオブジェクトを処理するロジックスレッドに置かれた軽量レンダリングモジュールで設定しました。これはレンダリング・コマンドをレンダリング・スレッドに送ります(「スプライトfをx、yでレンダリング」など)。

私はこのデザインが好きですが、私の問題は現在リソース作成にあります。スプライトfがテクスチャを必要としているとします。これはロード時にロジックスレッドで要求されます。問題は、OpenGLコンテキストがレンダリングスレッドにあるため、テクスチャはレンダラスレッドでのみ作成できることです。現在、論理スレッドとレンダスレッドの間の唯一の同期ポイントは、フレームの最後にレンダリングキューを交換するときです。そのままにしておきたいと思います。

どのようにしてレンダリングスレッド上のものだけをレンダリングしながら、ロジックスレッド上でテクスチャやvboなどを作成したいのかを解決できますか? OpenGLのコンテキストを共有するのは良いアプローチですか?あるいはエンジンの他のデザインかもしれない?

EDIT:別の方法として、論理スレッドからの要求を入れるキューを用意することです。 「テクスチャの作成」など。レンダースレッドは、このキューを繰り返し処理してから、もう一方のキューのレンダリングを開始します。私はこの解決策を気に入っています。

答えて

2

OpenGLでは、レンダリングスレッドからglBindTextureを呼び出す必要があります。 GLSurfaceView.Renderer onSurfaceCreatedメソッド(レンダリングスレッドから呼び出されるメソッド)からバインドすることを強くお勧めします。 GLコンテキストが再作成されると、これはすべてを再バインドするために再び呼び出されます。

別のスレッドから駆動する場合は、GLSurfaceViewオブジェクトのqueueEventを呼び出してレンダリングスレッドを実行可能にします。 onSurfaceCreatedがまだ呼び出されていないレースを見てください。

ゲームで幸運を祈る!