Czy po udanym glLinkProgramie powinienem usunąć / odłączyć moje shadery?


45

Czy po połączeniu programu i zastanowieniu się nad programowaniem defensywnym powinienem usunąć i odłączyć shadery używane do łączenia tego programu?

Jeśli tak, czy to zwolni jakieś zasoby? Czy te obiekty modułu cieniującego zostaną uwolnione dopiero po wywołaniu glDeleteProgram?

edycja: Tylko dla wyjaśnienia, co robię (co jest zgodne z odpowiedzią):

glCreateShader -> glShaderSource -> glCompileShader -> glCreateProgram -> glAttachShader -> glLinkProgram -> glDetachShader -> glDeleteShader -> rysuj za pomocą tego programu do cieniowania -> a kiedy już go nie potrzebuję glDeleteProgram

Odpowiedzi:


46

Tak, zawsze powinieneś to zrobić. Nie dowiedziałem się o tym do niedawna, ale moduł cieniujący nie zostanie faktycznie usunięty, glDeleteShaderdopóki nie zostanie odłączony. Jest wspomniany na stronie podręcznika dlaglDetachShader

EDYCJA : Prawie brakowało mi też odrobiny usuwania shaderów. Tak, powinieneś to zrobić, ponieważ zwalnia pamięć używaną do przechowywania źródła modułu cieniującego i niepowiązanego kodu obiektowego. Jest to wyjaśnione bardziej szczegółowo w tym pytaniu StackOverflow .


+1, a także ułatwia czyszczenie, ponieważ masz tylko jeden obiekt do śledzenia i glDelete.
Maximus Minimus

2

Kolejność jest prawidłowa, ale tak naprawdę nie trzeba odłączać modułów cieniujących, ponieważ wywołanie glDeleteProgram robi to dla ciebie ze wszystkimi dołączonymi modułami cieniującymi, a następnie są one automatycznie usuwane (jeśli zostały oznaczone do usunięcia za pomocą funkcji glDeleteShader).

Odniesienie: http://www.opengl.org/sdk/docs/man/xhtml/glDeleteProgram.xml .


Obiekty modułu cieniującego zajmują dużo pamięci w porównaniu do każdego programu. Lepiej je usunąć po zakończeniu kompilacji programów i dostępności większej ilości pamięci na ważniejsze rzeczy.
Robert Rouhani,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.