2011-08-15 9 views
6

openGL, doku için ne kadar süre saklar?Android: OpenGL bir dokuyu ne kadar süreyle depolar?

Bir etkinlikten ayrıldığınızda doku belleği geri dönüştürülür mü?

Örneğin ben şu kodu varsa:

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]; 

ne tür değişiklikler dönüş değeri geçersiz kılar?

Bir faaliyeye geri döndüğümde tüm dokularmı yeniden yüklemek istemiyorum (kişinin bir telefon konuşması olduğunu söyleyin) çünkü bu gerçekten işleri yavaşlatıyor.

Güncelleme:

Bulunan @svdree tarafından aşağıda verilen cevabı onaylar Renderer belgelerinde, bu bilgi:

EGL Bağlam Kayıp EGL render bağlam kaybolur durumlar vardır. Bu genellikle cihaz uykuya geçtikten sonra uyanırsa olur. EGL içeriği kaybolduğunda, o içerikle ilişkili tüm OpenGL kaynakları (dokular gibi) otomatik olarak silinecektir. İşleme işleminin doğru bir şekilde devam ettirilmesi için, bir oluşturucu hala ihtiyaç duyduğu kayıp kaynakları yeniden oluşturmalıdır. OnSurfaceCreated (GL10, EGLConfig) yöntemi, bunu yapmak için uygun bir yerdir. dokular benim faaliyetleri özel GLRenderer bir başvuru olan bir taban etkinliğinden devralan alarak sorunu çözmeye çalıştılar bu soru göndermeden yana EGL Bağlamında

ilgili demektir

. Temel olarak, OpenGLSurface View'ı ileriye doğru iletebilirim (yani, bunu bir etkinlikte başlatıp bir sonraki adımda kullanabilirsiniz), ancak kapatma işleminden geçtikten sonra tekrar başlatılmaz.

Ayrıca, faaliyetlerinizi şeffaf hale getirmenin saydam etkinliğin altındaki openGL içeriğini koruduğunu da fark ettim (bu mantıklıdır, ancak yalnızca menüler ve benzerleri için yardımcı olur). Bununla birlikte, openGL aktivitesinin her zaman biraz daha saydam olmasını, böylece tüm aktivitelerinizde arka planda bulunan dokuları koruduğunu (muhtemelen yapacağım budur) her zaman mümkün olacaktır.

cevap

1

Bir etkinlik, OpenGL içeriğiniz kaybolur, yani tüm dokularınız, köşe tampon nesneleri vb. yeniden oluşturulmalıdır. Bu genellikle GLSurfaceView.Renderer sınıfının onSurfaceCreated() yönteminde yapılır.

+0

Bağlamı yeni bir aktiviteye geçirebilir veya bir şekilde kaydedebilir. Birinin bir çağrı alması, ardından başvuruma geri döndüğü ve tüm dokuların yeniden yüklenmesi gerektiği durum için endişeleniyorum. – tjb

+0

Kaybedilen bir içerik kayboldu, kaydedilemiyor. Bir bağlamı "kaybetmek" genellikle sistemin başka yapacak bir şeye sahip olduğunu veya bir hata oluştuğunu ve tüm video kaynaklarını yeniden oluşturmanızı gerektirdiğini gösterir. – ssube

+0

Bu, Android'de yaygın bir tasarım desenidür; Başka bir etkinlik ön tarafa geldiğinde, diğer faaliyetlerin bunları kullanabilmesi için kaynaklarınızı boşaltmanız gerekir (sınırlı kaynaklara sahip sistemlerde gerçekten yararlıdır). Bu GLSurfaceView'de yerleşik işlevselliktir. Ben GLSurfaceView kendi sürümü yazarak bu etrafında çalışabilirsiniz şüpheli, ama ben bunu tavsiye etmem. Ayrıca, kaynaklarınızı tekrar yüklerken görünür olan şeylere öncelik verirseniz, bu durumun yavaş olması gerekmez. – svdree

0

onPause(), çoğu openGL tutamağını vb. OpenGL arazisinde iyi şanslar!