2011-08-15 39 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)方法是一個方便的地方。

這意味着,紋理都與EGL上下文

由於張貼這個問題,我試圖通過讓我從活動有一個自定義GLRenderer參考基地活動繼承來解決這個問題。基本上,我可以向前傳遞OpenGLSurface View(即使它在一個活動中實例化,然後在下一個活動中使用它),但是一旦它完成關閉過程,它就不會再次啓動。

我還發現,使您的活動透明可以保留透明活動下的openGL上下文(這很有道理,但僅對菜單等有幫助)。不過,我認爲在openGL活動之後,每次活動都可能會有點透明,從而保留所有活動背景中的紋理(這可能是我會做的)

回答

1

當你離開一個活動,你的OpenGL上下文將會丟失,這意味着你需要重新創建所有的紋理,頂點緩衝區對象等。這通常在GLSurfaceView.Renderer類的onSurfaceCreated()方法中完成。

+0

我可以將上下文傳遞給新的活動,或以某種方式保存它。我很擔心有人接電話,然後回到我的應用程序,所有紋理都必須重新加載。 – tjb

+0

丟失的上下文丟失,無法保存。 「丟失」上下文通常表示系統有其他事情要做,或發生錯誤,並且需要重新創建所有視頻​​資源。 – ssube

+0

這是Android中的常用設計模式;每當另一項活動進入前臺時,您需要釋放資源,以便其他活動可以使用它們(對於資源有限的系統真的有幫助)。這是GLSurfaceView中的內置功能。我懷疑你可以通過編寫你自己的GLSurfaceView版本來解決這個問題,但我不會推薦。此外,如果您再次加載資源時優先考慮實際可見的內容,則不必那麼慢。 – svdree

0

onPause()拋出大多數openGL句柄等!祝你好運openGL的土地!