2011-07-01 5 views
3

OpenGLESアプリケーションの非メインスレッドにいくつかのテクスチャをプリロードする必要があります。私はこれを読んだ:Can't call glGenTextures on multithreaded android appしかし、私が必要とするより多くのJavaバージョン。メインループにテクスチャをアップロード/作成するには、ロードするスレッドにどのように伝える必要がありますか?私はコンテキストを作成し、何らかの形で主なコンテキストと共有することについて何かを読んでいます。どうやって?OpenGLES他のスレッドでプリロードテクスチャ

+1

私は別の質問への答えとして、別のスレッドにテクスチャをアップロードするためのJava専用ソリューションを記述しました:http://stackoverflow.com/questions/6318311/threading-textures-load-process-for-android-opengl- game/19740938#19740938 – Rodja

答えて

3

リソース/ディスクからGLのレンダリングまでのテクスチャを取得するには、2つの手順があります。これらを分離して、ワーカースレッドのロードと計算作業のほとんどを可能にします。

最初のステップは、BitmapFactory.decodeResouce()のようなものを使用する、Javaレベルで実際にビットマップを作成することです。この部分はあなたが好きなスレッドで行うことができます。ロードが完了したら、そのビットマップをArrayListやキューなどにスローします。リストのアクセスを同期ブロックで囲むようにしてください。

第2のステップは、GLスレッドで実行されなければならないglGenTexturesを呼び出すことです。そのため、drawFrame()メソッドの開始時に、ビットマップを保存するArrayListのサイズを確認し、サイズが0より大きい場合は、glGenTexuresを呼び出して配列からビットマップを削除して再循環させます。

+2

彼はむしろ 'drawFrame()'よりも 'surfaceCreated()'にテクスチャを読み込むべきです。 – Wroclai

+0

@Pompe de velo - たくさんの読み込みがある場合は、ユーザーに何らかの読み込み/進捗インジケータを表示し、複数のdrawFrame()呼び出しでテクスチャを読み込むことが必要になります。数秒以上かかることがあるsurfaceCreatedでのすべての読み込みを実行すると、応答しない表示/ UIによってアプリがハングアップしてANRが発生している可能性があります。 – Josh

+0

正しくないANRは、レンダリングスレッドではなくUIスレッドを遅延させる場合に発生します。しかし、 'surfaceCreated()'の読み込みは、それが一回の初期化を行う場所であるため、はるかに意味があります。 – Wroclai

関連する問題