2011-08-15 5 views
6

OpenGLがテクスチャを保存する時間はどれくらいですか?Android:OpenGLでテクスチャを保存する時間はどれくらいですか?

アクティビティを終了するときにテクスチャメモリがリサイクルされますか?例えば

私は次のコードがある場合:

mGL.glGenTextures(1, mTextures, 0); 
     mGL.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[0]); // A bound texture is 
                  // an active texture 

     //mGL.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGBA, bitmap.getWidth(),bitmap.getHeight(), 0, GL10.GL_RGBA, GL10.GL_FLOAT, textures); 
     GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0,GL10.GL_RGBA, bitmap, 0); 

     // create nearest filtered texture 
     mGL.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, 
       GL10.GL_LINEAR); // This is where the scaling algorithms are 
     mGL.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, 
       GL10.GL_LINEAR); // This is where the scaling algorithms are 
     mGL.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, 
       GL10.GL_CLAMP_TO_EDGE); 
     mGL.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, 
       GL10.GL_CLAMP_TO_EDGE); 
     GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 

     //bitmap.recycle(); 
     Log.v("GLSurfaceView", "Loading Texture Finished"); 
     return mTextures[0]; 

戻り値が無効になりますどのような変更を?

アクティビティに戻ったときにすべてのテクスチャをリロードすることはできません(実際には通話があったと言います)。

更新:

見つかり@svdreeは下記の答えを確認レンダラのドキュメント、この情報:

EGLコンテキストロスト EGLレンダリングコンテキストが失われる状況があります。これは通常、デバイスがスリープ状態になった後に起動するときに発生します。 EGLコンテキストが失われると、そのコンテキストに関連付けられているすべてのOpenGLリソース(テクスチャなど)が自動的に削除されます。正しくレンダリングされるようにするために、レンダラーはまだ必要なリソースを再作成する必要があります。 onSurfaceCreated(GL10、EGLConfig)メソッドはこれを行うのに便利な場所です。テクスチャが、私は私の活動はカスタムGLRendererへの参照を持つベースの活動を継承したことによって問題を解決しようと試みてきたこの質問を投稿しているのでEGLコンテキスト

に関連していることを意味

。基本的に、私はOpenGLSurface Viewを前進させることができます(つまり、1つのアクティビティでインスタンス化して次のインスタンスで使用する)が、シャットダウン手順を経ると再び起動しません。

私は、あなたのアクティビティを透過的にすることは、透明なアクティビティの下にOpenGLのコンテキストを保存することがわかりました(これは意味がありますが、メニューなどに役立ちます)。しかし、OpenGLアクティビティを少し透明にして、すべてのアクティビティでバックグラウンドでテクスチャを保存すると、常にすべてのアクティビティを持つことができると思います(これはおそらく私がやることです)

答えて

1

OpenGLコンテキストが失われます。つまり、すべてのテクスチャ、頂点バッファオブジェクトなどを再作成する必要があります。これは、通常、GLSurfaceView.RendererクラスのonSurfaceCreated()メソッドで行われます。

+0

コンテキストを新しいアクティビティに渡すこともできますし、何らかの形で保存することもできます。誰かが電話をかけてからアプリケーションに戻ってきて、すべてのテクスチャが再び読み込まれなければならないと心配です。 – tjb

+0

失われたコンテキストは失われ、保存することはできません。コンテキストを「失う」とは、通常、システムに何か他に何かがあるか、エラーが発生したことを示し、すべてのビデオリソースを再作成する必要があります。 – ssube

+0

これはAndroidの一般的なデザインパターンです。別のアクティビティーが前面に来るときは、他のアクティビティーで使用できるようにリソースを解放する必要があります(リソースが限られているシステムでは本当に役立ちます)。これは、GLSurfaceViewの組み込み機能です。自分のGLSurfaceViewのバージョンを書くことでこれを回避することができますが、私はそれをお勧めしません。また、リソースを再度ロードするときに実際に表示されるものを優先すると、これは遅くなる必要はありません。 – svdree

0

onPause()は、ほとんどのOpenGLハンドルなどをトスする! OpenGLの土地で幸運を祈る!

関連する問題