2010-02-06 16 views
8

Czy muszę oczyścić wszystkie DisplayListy, Tekstury, (Geometria-) Shadery itd. Ręcznie za pomocą funkcji glDelete *, czy też pamięć GPU może zostać automatycznie zwolniona po wyjściu/awarii programu?Czyszczenie pamięci GPU OpenGL jest wymagane?

Uwaga: pamięć GPU odnosi się do pamięci dedykowanej na dedykowanej karcie graficznej, a nie do pamięci procesora.

+0

Zależy od definicji "musisz". Nie musisz nic robić. Jeśli chcesz być "poprawny", tak; zawsze musisz zwolnić swoje zasoby, kiedy skończysz. – GManNickG

+0

Chciałem się dowiedzieć, czy program zostanie automatycznie oczyszczony, * wkrótce * po zamknięciu programu lub jeśli pamięć GPU zostanie utracona do następnego ponownego uruchomienia. Miałem nadzieję, że ktoś wskaże mi specyfikację OpenGL i tam ją zdefiniowano (chociaż moja ulubiona wyszukiwarka nie wypluła niczego użytecznego dla mnie). – drahnr

+0

Obie! Naprawdę, posprzątaj po sobie, nawet jeśli system operacyjny zrobi to za Ciebie. Nie musisz nigdy "usuwać" żadnej "nowej" pamięci, system operacyjny po prostu ją zwolni, gdy program się skończy, ale nadal nie jest to coś, co bym zasugerował. –

Odpowiedz

13

Uwolnij kontekst, wszystko inne jest lokalne dla kontekstu (chyba że włączono udostępnianie listy wyświetlania) i zniknie wraz z nim.

+0

Czy możesz pomóc w komentowaniu, co jeśli wglDeleteContext nie zwalnia całej pamięci? – SOUser

+0

@SOUser: Czy włączono udostępnianie zasobów między kontekstami? Następnie zasoby zostaną zwolnione po usunięciu ostatniego z połączonych kontekstów. Jeśli masz dowody na to, że usunięcie kontekstu nie powoduje oczyszczenia, zgłoś błąd za pomocą sterownika GPU. –

1

Po wyjściu z programu (lub awarii), pamięć, która jest aktualnie przydzielona, ​​powinna zostać zwolniona w końcu w ten sam sposób, w jaki pamięć główna jest zwykle zwalniana po wyjściu z programu. Może upłynąć trochę czasu, zanim GPU "zrozumie", że pamięć jest dostępna do ponownego użycia.

Nie powinieneś jednak polegać na tym zachowaniu, ponieważ może to zależeć od implementacji sterowników karty graficznej. Znacznie lepiej jest wykonywać wyraźne czyszczenie połączeń, gdy (jako programista) wiesz, że nie będziesz potrzebować tej pamięci ponownie.

1

Wszystkie zasoby GPU zostaną zwolnione po wyjściu z programu. Łatwym sposobem na sprawdzenie jest to, aby nie usuwać rzeczy i uruchamiać aplikację wielokrotnie, aby sprawdzić, czy nie powiedzie się alokacja po kilku iteracjach.

8

Jak wspomniano, twój system operacyjny (we współpracy z menedżerem zasobów sterownika) powinien zwolnić zasoby. Po to są systemy operacyjne. Warto zauważyć, że nie ma to nic wspólnego z OpenGL, ale jest czymś, co jest częścią karty dobrze zachowanych systemów operacyjnych i związanych z nimi sterowników. System operacyjny obsługuje wszystkie zasoby systemowe: all. Obiekty OpenGL są tylko ich podzbiorem i nie różnią się od nich, powiedzmy uchwyt pliku. Teraz, aby uzyskać bardziej konkretne informacje, powinieneś wskazać system operacyjny, na którym Ci zależy.

BTW, tu biorę wyjątek z odpowiedzią od ChrisF. Kierowca nie powinien decydować, czy musi wykonać czyszczenie. Modele sterowników OS będą miały przejrzysty interfejs między sterownikiem OpenGL w trybie użytkownika (który nie powinien wykonywać rzeczywistej alokacji zasobów Gfx, ponieważ jest współdzielony w komputerze), systemem operacyjnym (który zapewnia ekwiwalent wywołań systemowych do alokacji zasobów) i sterownik trybu jądra (który służy jedynie do wykonywania poleceń systemu operacyjnego w sposób zgodny z gpu). Tak jest przynajmniej w przypadku modeli WIN2K i WDDM.

A więc ... jeśli twój proces ulegnie awarii lub w inny sposób zakończy się, w tych modelach, OS jest odpowiedzialny za wywołanie sterownika trybu jądra w celu zwolnienia wszystkich zasobów powiązanych z procesem.

Teraz, niezależnie od tego, czy powinien być, czy też nie, jest to coś w rodzaju pytania o tabulacje lub spacje w kodzie źródłowym. Różni ludzie mają tu różne wierzenia. "system i tak to zrobi, natychmiastowe przerwanie jest lepszym doświadczeniem użytkownika końcowego" vs "Chcę wiedzieć, czy nie mam wycieku pamięci, ponieważ jeśli mój program jest długotrwały, naprawdę nie chcę, aby trafiał on na błędy OOM Najlepszym sposobem, aby to zrobić, jest brak wycieku w całym "są 2 główne linie myśli, które znam.

+0

Myślę, że dostałem "dlaczego" .. thx za twoją odpowiedź – drahnr

+0

Pamiętaj, że się nie zgadzasz. Tak, system operacyjny wysyła zdarzenie do sterownika, gdy potrzebne jest czyszczenie ... ale nadal jest to sterownik, który wykonuje rzeczywistą pracę, a niepowodzenie czyszczenia jest winą błędnego sterownika. –

+0

@BenVoigt: próbowałem wyjaśnić, o co mi chodzi. Czy to jest lepsze? – Bahbar

-1

W OpenGL nie ma pamięci do przechowywania informacji o rysunku. tutaj, gdy wykonujemy program opengl, ten czas wywołujący wywołanie metody ramki rysowania sekwencyjnie. W każdym razie, jeśli narysujemy linię lub okrąg, oznacza to, że w każdej chwili metoda wywołującej ramki do rysowania w określonym miejscu., Ale opengl nie przechowuje tej linii w pamięci. W każdej chwili, tylko jej rysunek. ale gdy zobaczyliśmy, że linia jest pomyślna.

Np: W systemie Android OpenGL es2.0 używana jest ta metoda modułu renderującego wewnątrz metody drawframe (metoda rysowania wewnątrz) do rysowania linii lub okręgów itp. Użyłem tego programu OpenGL es2.0 w rozwoju aplikacji autocad na Androida .. jeśli chcesz wyczyścić linie oświecone użyj tej metody w klasie renderer wewnątrz na metodzieRozrywka GLES20.glClearColor (0.0f, 0.0f, 0.0f, 1.0f); GLES20.glClear (GLES20.GL_COLOR_BUFFER_BIT); GLES20.glClear (GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);

+0

Cóż, oczywiście nie przechowuje on żadnej narysowanej geometrii, ale przechowuje całą masę innych rzeczy, zarówno w pamięci CPU, jak i GPU. Najlepszy przykład, gdzie jest ta linia narysowana i dlaczego możesz ją zobaczyć? –

+0

Witaj Christian Rau, masz rację. Mówiłem o pamięci GPU tylko pamięci. Mam problem z wyżej wymienionych. zobacz ten link i jeśli to możliwe, pomóż mi w tej walce. http://stackoverflow.com/questions/17187032/why-my-opengl-output-differs-for-various-devices Proszę zobaczyć ten przykładowy kod również z tego linku http://tuxbalaji.wordpress.com/2013/06/ 19/draw-a-line-using-opengles2-0-by-touch-event-in-android / – harikrishnan

Powiązane problemy