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活動之後,每次活動都可能會有點透明,從而保留所有活動背景中的紋理(這可能是我會做的)
我可以將上下文傳遞給新的活動,或以某種方式保存它。我很擔心有人接電話,然後回到我的應用程序,所有紋理都必須重新加載。 – tjb
丟失的上下文丟失,無法保存。 「丟失」上下文通常表示系統有其他事情要做,或發生錯誤,並且需要重新創建所有視頻資源。 – ssube
這是Android中的常用設計模式;每當另一項活動進入前臺時,您需要釋放資源,以便其他活動可以使用它們(對於資源有限的系統真的有幫助)。這是GLSurfaceView中的內置功能。我懷疑你可以通過編寫你自己的GLSurfaceView版本來解決這個問題,但我不會推薦。此外,如果您再次加載資源時優先考慮實際可見的內容,則不必那麼慢。 – svdree