2016-04-13 23 views
0

私はSurfaceTexture.detachFromGLContextを参照しています。「この呼び出しの結果、OpenGL ESテクスチャオブジェクトは削除されます。」なぜSurfaceTexture.detachFromGLContextを呼び出した結果、OpenGL ESテクスチャオブジェクトが削除されるのですか?

デタッチを呼び出すときにフレームワークがこのテクスチャオブジェクトを削除する必要がある理由について説明してください。テクスチャはSurfaceTextureの外で作成され、コンストラクタに提供されるため、説明してください。だから、私はデタッチ後もテクスチャを使用し、作成者はそのライフサイクルを制御できるはずです。

私たちは、これをattachメソッドとMediaCodecの組み合わせで使用しようとしています。私たちのユースケースでは、将来の使用のためにビデオフレームテクスチャをコピーする必要があります。続い

はSurfaceTextureを作成するためのサンプルコードである:

int[] textures = new int[1]; 
GLES20.glGenTextures(1, textures, 0); 
SurfaceTexture surfaceTexture = new SurfaceTexture(textures[0]); 

そして表面が作成され、ビデオ・フレームと、復号化を実行中のコードサンプル

Surface surface = new Surface(surfaceTexture); 
MediaCodec videoDecoder.configure(..., surface, null, 0); 

を以下のようにMediaCodecに通過しますテクスチャにデコードされて、私はテクスチャを保持しようとしているとSurfaceTextureに異なるテクスチャを割り当てるので、私はそれを使用することができますし、デコーダは別のフレームを新しいテクスチャにデコードすることができます。

surfaceTexture.detachFromGLContext(); 
surfaceTexture.attachToGLContext(newTexture); 

しかし、問題はアンドロイドフレームワークがテクスチャを削除することです。私の主張はバグでなければならないか、テクスチャを削除する理由があるはずです。

答えて

0

各OpenGLアイテムはコンテキストにバインドされているため、デタッチされると削除される必要があります。

コンテキストは、いくつかのIDまたは列挙でバインドされたバッファを作成し、処理する責任があります(同じことですが、列挙はあらかじめ定義されています)。したがって、コンテキストが削除されると、すべてのアイテムも削除されます。 2つのコンテキストがある場合、どの状態やバッファも接続されておらず、OpenGLに行った呼び出しは現在バインドされているコンテキストにのみ影響します。したがって、アイテムを取り外すとは、削除することを意味します。SurfaceTextureが持つ唯一の接続はテクスチャIDであり、他の場所では使用できません。あなたのCPUオブジェクト(表面テクスチャ)とGPUデータ(テクスチャ)の間の接続を削除した場合、テクスチャを削除するか、テクスチャデータがガベージになり、メモリリークが発生する。

なぜコンテキストからテクスチャを切り離したいのか分かりませんが、何らかの理由でコンテキストからテクスチャを移動する必要がある場合は、テクスチャの実際の所有者である別のコンテキストが必要になります。このためには、共有コンテキストが必要です。これは、コンストラクタの引数としてメインコンテキストを使用して新しいコンテキストを作成することを意味します。このようにして、主なコンテキストは、共有されたコンテキストによって所有されているテクスチャにアクセスすることができます。これにより、「現在のコンテキスト」がスレッドごとであるため、複数のスレッドを使用することもできます。

+0

私はユースケースを説明するためのコードサンプルを追加しました。これは複数のスレッドではありません。 –

+0

単に新しいサーフェステクスチャを作成し、必要になるまで古いものを保存して現在の状態に挿入することはできませんか?または可能であれば、新しいテクスチャIDをサーフェステクスチャに設定します。文脈から切り離すことは、あなたのケースであなたが探しているものではありません。特定のポイントに少なくとも2つのテクスチャが必要で、両方をアタッチする必要があります。 –

+0

いいえ、MediaCodec videoDecoder.configure(...、surface、null、0)以外のMediaCodecにSurfaceTextureを渡す方法は他にありません。 –

0

"この呼び出しの結果、OpenGL ESテクスチャオブジェクトは削除されます。"

外部表面の場合、テクスチャオブジェクトを削除することは物理メモリを削除することと同じではないことに注意してください。物理的な外部メモリバッファはGLによって所有されておらず、割り当てられて再利用できるようになります(GLに再インポートする場合は、GLテクスチャオブジェクトを再作成して再度ラップする必要があります)。

+0

私の質問をもっと詳しく説明するコードサンプルを追加しました。私のポイントはGL内に作成されたテクスチャです。 –

+0

surfaceViewをデタッチすると、テクスチャオブジェクトのバッキングメモリがなくなるためです。 – solidpixel

関連する問題