2

テクスチャ マップとして使用するテクスチャがあります。それぞれ 256 ピクセルの正方形に分割された 2048 x 2048 のテクスチャです。したがって、64個の「スロット」があります。このマップは、空、部分的に塗りつぶされている、または完全である可能性があります。画面上では、それぞれスプライト マップのスロットを持つ単純な正方形を描いています。

問題は、スロットのアセットが利用可能になると、このマップを時々更新しなければならないことです。これらのアセットはインターネットからダウンロードされますが、最初の情報が事前に届くので、使用するスロットの数を知ることができ、ローカル ストレージを参照して、最初に描画できるスロットを確認できます。

例えば。私の情報によると、10 個の正方形があり、そのうち 5 個はローカルで利用できるため、スプライト マップが初期化されると、これらの正方形は既に塗りつぶされており、描画する準備ができています。画面に 10 個の正方形が表示されます。そのうちの 5 つは、それらのスロットのテクスチャ マップにイメージが格納され、残りの 5 つは一時的なイメージで描画されます。スロットの新しいアセットがダウンロードされると、スプライト マップ (バインドされ、描画に使用される) を新しい対応するテクスチャで更新したいのですが、描画が終了し、スプライト マップが更新された後、フラグを設定します。一時的なイメージではなく、そのスロットで描画を開始する必要がある OpenGL。

私が読んだことから、スプライトマップを更新するには3つの方法があります。

1) glTextImage2D を使用して新しいものをアップロードします。現在、このアプローチを使用しています。別のアップデーター テクスチャを作成し、それを単純に交換します。しかし、私は頻繁にメモリ警告に出くわします。

2) glTextSubImage2D を使用してテクスチャを変更します。これを機能させることができません。メモリ アクセス エラーまたは黒いテクスチャが発生し続けます。スレッドが同じではないか、使用中のテクスチャにアクセスしているためだと思います。

3) フレーム バッファ オブジェクトを使用する: これを試すことはできますが、既に使用されているテクスチャ バッファに描画できるかどうかはわかりません。

これを解決する正しい方法は何ですか?

これは iPhone での使用を想定しているため、リソースが限られています。

編集:ここに関連する何かについて話しているこの投稿を見つけました。

残念ながら、現在使用されているテクスチャの変更に焦点を当てているとは思いません。

4

1 に答える 1

0

スレッドは同じではありません

OpenGL-ES API はマルチスレッドではありません。メイン スレッドからテクスチャを更新します。テクスチャは GPU にアップロードする必要があるため、glTextSubImage2D が最も速くて簡単な方法です。この方向を保ってください:)

フレーム バッファ (テクスチャにアタッチ) でのレンダリングは、既に GPU にあるデータのレンダリングに対して非常に高速です。(あなたの場合ではありません)。はい、テクスチャにバインドされたフレーム バッファ (= テクスチャをカラー アタッチメントとして使用するフレーム バッファ) に描画できます。

1 つの制約: 1 回の描画呼び出しで同じテクスチャを読み書きすることはできません (現在のフレーム バッファにアタッチされているテクスチャをテクスチャ ユニットにバインドすることはできません)。

于 2013-06-21T12:00:29.487 に答える