2011-08-15 13 views
6

Jak długo OpenGL przechowuje teksturę?Android: na jak długo OpenGL przechowuje teksturę?

Czy pamięć tekstury zostaje poddana recyklingowi po opuszczeniu działania?

Na przykład jeśli mam następujący kod:

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

Jakie zmiany spowoduje utratę wartości zwracanej?

Nie chcę ponownie wczytać wszystkich tekstur, gdy wracam do działania (powiedzmy, że ktoś miał telefon), ponieważ to naprawdę spowalnia działanie.

Aktualizacja:

Znaleziony ta informacja w dokumentacji Renderer, co potwierdza odpowiedź udzieloną poniżej @svdree:

EGL Kontekst Zgubione Istnieją sytuacje, gdy z kontekstu renderowania EGL zostaną utracone. Zdarza się to zwykle, gdy urządzenie budzi się po zasypianiu. Po utracie kontekstu EGL wszystkie zasoby OpenGL (takie jak tekstury) powiązane z tym kontekstem zostaną automatycznie usunięte. Aby renderowanie było prawidłowe, renderer musi odtworzyć wszystkie utracone zasoby, których potrzebuje. Metoda onSurfaceCreated (GL10, EGLConfig) jest dogodnym miejscem do tego.

Oznacza to, że tekstury są związane z kontekstem EGL

Od opublikowania na to pytanie starałem się rozwiązać ten problem poprzez moje działania dziedziczą z działalności podstawowej, która ma odniesienie do niestandardowego GLRenderer. Zasadniczo mogę przekazać widok OpenGLSurface do przodu (tzn. Sprawić, aby był on tworzony w jednym działaniu i używał go w następnym), ale gdy przejdzie procedurę zamykania, nie zostanie ponownie uruchomiony.

Zauważyłem również, że nadanie przejrzystości działaniom zachowuje kontekst OpenGL poniżej przezroczystości (co ma sens, ale pomaga tylko w menu i tym podobnych). Jednak przypuszczam, że byłoby zawsze możliwe, że każde działanie po aktywności OpenGL będzie po prostu trochę przezroczyste, zachowując tekstury w tle we wszystkich twoich działaniach (prawdopodobnie to zrobię)

Odpowiedz

1

Po opuszczeniu działanie, twój kontekst OpenGL zostanie utracony, co oznacza, że ​​wszystkie twoje tekstury, obiekty bufora wierzchołków itp. będą musiały zostać odtworzone. Zwykle robi się to w metodzie onSurfaceCreated() klasy .

+0

Czy mogę przekazać kontekst do nowego działania lub jakoś go zapisać. Martwię się o przypadek, w którym ktoś bierze telefon, a następnie wraca do mojej aplikacji i wszystkie tekstury muszą się załadować ponownie. – tjb

+0

Utracony kontekst został utracony, nie można go zapisać. "Utrata" kontekstu zwykle oznacza, że ​​system miał coś innego do zrobienia lub wystąpił błąd i wymaga odtworzenia wszystkich zasobów wideo. – ssube

+0

To jest typowy wzór w systemie Android; za każdym razem, gdy pojawia się inne działanie, musisz zwolnić zasoby, aby inne czynności mogły z nich korzystać (naprawdę pomocne w systemach z ograniczonymi zasobami). Jest to wbudowana funkcjonalność w GLSurfaceView. Podejrzewam, że możesz obejść to, pisząc własną wersję GLSurfaceView, ale nie poleciłbym tego. Poza tym, jeśli nadasz priorytet materiałowi, który jest widoczny podczas ponownego ładowania zasobów, nie musi to być zbyt wolne. – svdree

0

onPause() rzuca większość uchwytów OpenGL itp! Powodzenia w krainie OpenGL!

Powiązane problemy