2013-08-29 36 views
6

Cách thích hợp để thực hiện việc này là gì?OpenGL program/shader uninitialization

tôi đang làm các bước sau:

  1. Tạo Shader (s)
  2. Compile Shader (s)
  3. Tạo Chương trình
  4. Đính kèm Shader (s) để Chương trình
  5. Chương trình liên kết
  6. Xóa Shader (s)

Trong http://www.opengl.org/wiki/GLSL_Object nó nói: Bạn không cần phải loại bỏ rõ ràng các đối tượng đổ bóng, ngay cả sau khi liên kết chương trình. Tuy nhiên, bạn nên làm như vậy khi liên kết hoàn tất, nếu không thì đối tượng chương trình sẽ giữ các đối tượng shader đính kèm của nó còn sống khi bạn cố xóa chúng.

Và cũng từ Proper way to delete GLSL shader? cho biết nó sẽ tăng bộ nhớ nếu tôi không xóa các trình đổ bóng.

Vì vậy, việc kiểm tra trên http://www.opengl.org/sdk/docs/man/xhtml/glDetachShader.xml, nó nói Nếu shader đã được gắn cờ để xóa bởi một cuộc gọi đến glDeleteShader và nó không được gắn vào bất kỳ đối tượng chương trình khác, nó sẽ bị xóa sau khi nó đã được tách ra.

Vì vậy, # 6 của tôi là vô dụng trừ khi tôi tháo nó sau khi phải không?

Tôi có nên tách và xóa sau khi Chương trình đã được biên dịch chính xác (để tiết kiệm bộ nhớ) hay tôi nên tách/xóa chỉ khi ứng dụng của tôi đóng cửa?

+0

sidenote: bạn cần gọi 'glLinkProgram' cho các thay đổi được thực hiện cho thuộc tính ràng buộc với 'glBindAttribLocation' để có hiệu lực.Vì vậy, nếu bạn xóa và tách các shaders khỏi một chương trình liên kết thì ràng buộc thuộc tính có thể không được thay đổi một cách hiệu quả mà không cần gắn lại các shaders với nó. – PeterT

Trả lời

5

Vì vậy, # 6 của tôi là vô ích trừ khi tôi tháo nó sau khi phải không?

Có. Những gì GL làm cơ bản là tham chiếu đếm. Miễn là một số đối tượng khác đang tham chiếu đối tượng shader, nó sẽ vẫn còn sống. Nếu bạn xóa đối tượng, việc xóa thực tế sẽ bị trì hoãn cho đến khi tham chiếu cuối cùng bị xóa.

Tôi có nên tách và xóa sau khi chương trình đã được biên soạn một cách chính xác (để tiết kiệm bộ nhớ) hay tôi nên tách/chỉ xóa khi ứng dụng của tôi là đóng cửa?

Điều đó tùy thuộc vào bạn. Bạn có thể xóa ngay khi bạn không cần nữa. Nếu bạn không có kế hoạch để relink shader đó, bạn có thể hủy bỏ tất cả các đối tượng shader đính kèm ngay lập tức sau khi hoạt động liên kết ban đầu. Tuy nhiên, các đối tượng shader không tiêu tốn nhiều bộ nhớ (và không đi đến bộ nhớ GPU, chỉ các chương trình cuối cùng sẽ) nó thường không phải là vấn đề lớn nếu bạn xóa chúng sau này, hoặc thậm chí không xóa chúng tất cả, vì tất cả các tài nguyên GL sẽ bị phá hủy khi bối cảnh GL bị phá hủy (bao gồm cả trường hợp ứng dụng thoát). Tất nhiên, nếu bạn tạo các shaders động trong thời gian chạy, bạn cũng nên tự động xóa các đối tượng cũ và không sử dụng để tránh tích lũy rất nhiều đối tượng không sử dụng và rò rỉ hiệu quả tên bộ nhớ/đối tượng và vv.