Sau khi glLinkProgram thành công, tôi có nên xóa / tách các shader của mình không?


45

Sau khi tôi có một chương trình được liên kết và suy nghĩ về lập trình phòng thủ, tôi có nên xóa và tách các shader được sử dụng để liên kết chương trình này không?

Nếu có, điều đó sẽ giải phóng bất kỳ tài nguyên nào? Hay những đối tượng đổ bóng này sẽ chỉ được giải phóng sau một cuộc gọi glDeleteProgram?

chỉnh sửa: Chỉ để làm rõ những gì tôi đang làm là (phù hợp với câu trả lời):

glCreateShader -> glShaderSource -> glCompileShader -> glCreateProgram -> glAttachShader -> glLinkProgram -> glDetachShader -> glDeleteShader -> vẽ bằng chương trình shader này -> và khi tôi không cần chương trình shader này nữa

Câu trả lời:


46

Vâng, bạn nên luôn luôn làm điều này. Tôi đã không tìm hiểu về điều này cho đến gần đây, nhưng một shader thực sự sẽ không bị xóa glDeleteShadercho đến khi nó bị tách ra. Nó được đề cập trên trang người đàn ông choglDetachShader

EDIT : Hầu như đã bỏ lỡ một chút về việc xóa các shader. Có, bạn nên làm điều này vì nó giải phóng bộ nhớ được sử dụng để lưu trữ nguồn shader và mã đối tượng không liên kết. Điều này được giải thích chi tiết hơn trong câu hỏi StackOverflow này .


+1 và nó cũng giúp việc dọn dẹp dễ dàng hơn khi bạn chỉ có một đối tượng để theo dõi và glDelete.
Maximus Minimus

2

Thứ tự là đúng, nhưng bạn không thực sự cần phải đánh lừa các shader, bởi vì việc gọi glDeleteProgram sẽ thực hiện điều đó cho bạn với tất cả các shader đính kèm và sau đó chúng sẽ tự động bị xóa (nếu chúng được gắn cờ để xóa bằng func glDeleteShader).

Tham khảo: http://www.opengl.org/sdk/docs/man/xhtml/glDeleteProgram.xml .


Các đối tượng shader chiếm rất nhiều bộ nhớ so với mỗi chương trình. Tốt hơn hết là xóa chúng sau khi bạn biên dịch xong các chương trình của mình và có thêm bộ nhớ cho những thứ quan trọng hơn.
Robert Rouhani
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.