2010-02-06 33 views
8

Tôi có phải dọn dẹp tất cả các Trình hiển thị, Kết cấu, (Hình học) và Shaders vv bằng tay thông qua các hàm glDelete * hay không, hoặc bản ghi GPU có được tự động giải phóng khi Chương trình của tôi thoát/hỏng không?Làm sạch bộ nhớ OpenGL GPU, yêu cầu?

Lưu ý: Thẻ nhớ GPU chỉ bộ nhớ chuyên dụng trên thẻ đồ họa chuyên dụng, không phải bộ nhớ CPU.

+0

Phụ thuộc vào định nghĩa của bạn về "phải". Bạn không "phải" làm bất cứ điều gì. Nếu bạn muốn "đúng", có; bạn cần luôn giải phóng tài nguyên của mình khi bạn hoàn tất. – GManNickG

+0

Tôi muốn biết liệu nó có tự động dọn dẹp không, * ngay * sau khi Chương trình đóng, hoặc nếu bộ nhớ GPU bị mất cho đến lần khởi động tiếp theo. Tôi hy vọng một người nào đó có thể chỉ cho tôi về đặc điểm kỹ thuật OpenGL và nó đã được xác định ở đó (mặc dù công cụ tìm kiếm yêu thích của tôi đã không nhổ bất cứ điều gì hữu ích với tôi). – drahnr

+0

Cả hai! Thực sự, làm sạch sau khi bản thân bạn, ngay cả khi hệ điều hành làm điều đó cho bạn. Bạn không cần phải bao giờ 'xóa' bất kỳ bộ nhớ' mới' nào, hệ điều hành sẽ chỉ giải phóng nó khi chương trình kết thúc, nhưng vẫn không phải là điều tôi muốn đề nghị. –

Trả lời

13

Miễn phí ngữ cảnh, mọi thứ khác là cục bộ cho ngữ cảnh (trừ khi bạn bật chia sẻ danh sách hiển thị) và sẽ biến mất cùng với nó.

+0

Bạn có thể giúp bình luận nếu wglDeleteContext không giải phóng tất cả bộ nhớ? – SOUser

+0

@SOUser: Bạn có bật chia sẻ tài nguyên giữa các ngữ cảnh không? Sau đó, tài nguyên sẽ được giải phóng khi ngữ cảnh cuối cùng được liên kết bị xóa. Nếu bạn có bằng chứng rằng việc xoá ngữ cảnh không được dọn dẹp, hãy gửi một lỗi bằng trình điều khiển GPU. –

1

Khi chương trình của bạn thoát (hoặc treo) thì mọi bộ nhớ hiện tại đã được cấp phát sẽ được giải phóng cuối cùng giống như cách bộ nhớ chính thường được giải phóng khi chương trình thoát. Nó có thể là một thời gian trước khi GPU "nhận ra" rằng bộ nhớ có sẵn để sử dụng lại.

Tuy nhiên, bạn không nên dựa vào hành vi này vì nó có thể phụ thuộc vào cách trình điều khiển cạc đồ hoạ đã được triển khai. Tốt hơn hết là bạn nên thực hiện các cuộc gọi rõ ràng khi bạn (là lập trình viên) biết rằng bạn sẽ không cần bộ nhớ đó nữa.

1

Tất cả tài nguyên GPU của bạn sẽ được phát hành khi chương trình của bạn thoát. Một cách dễ dàng để kiểm tra là không xóa mọi thứ và chạy ứng dụng của bạn nhiều lần để xem nó có bị lỗi sau một vài lần lặp hay không.

8

Như những người khác đã đề cập, HĐH của bạn (phối hợp với người quản lý tài nguyên trình điều khiển) nên phát hành tài nguyên. Đó là những gì OSes dành cho. Cần lưu ý rằng điều này không liên quan gì đến OpenGL, nhưng nó là một phần của điều lệ của các hệ điều hành tốt và các trình điều khiển liên quan của họ. Hệ điều hành có để xử lý tất cả các tài nguyên hệ thống tất cả. OpenGL chỉ là một tập hợp con của chúng, và chúng không khác gì, nói một tập tin xử lý. Bây giờ để có được cụ thể hơn, bạn nên xác định hệ điều hành mà bạn quan tâm.

BTW, Đây là nơi tôi ngoại lệ với câu trả lời của ChrisF. Nó không nên được lên đến người lái xe để quyết định nó cần phải làm sạch. Các mô hình trình điều khiển OS sẽ có giao diện rõ ràng giữa trình điều khiển OpenGL của người dùng (không nên phân bổ tài nguyên gfx thực sự, vì nó được chia sẻ trong máy), hệ điều hành (cung cấp tương đương với các cuộc gọi hệ thống để cấp phát tài nguyên) và Trình điều khiển chế độ lõi (chỉ đơn thuần là ở đó để thực hiện các lệnh hệ điều hành theo cách tương thích với gpu). Đây là ít nhất là trường hợp với các mô hình WIN2K và WDDM. Vì vậy ... nếu quá trình của bạn bị treo hoặc kết thúc, trong các mô hình đó, đó là trách nhiệm của hệ điều hành để gọi trình điều khiển chế độ hạt nhân giải phóng tất cả các tài nguyên được liên kết với quy trình.

Bây giờ, cho dù bạn nên hay không thực sự là một cái gì đó giống như yêu cầu tab hoặc không gian trong mã nguồn. Những người khác nhau có niềm tin khác nhau ở đây. "Hệ điều hành sẽ làm điều đó, bỏ ngay lập tức là trải nghiệm người dùng cuối" vs "Tôi muốn biết liệu tôi có bị rò rỉ bộ nhớ hay không vì tôi có chương trình dài hạn, tôi thực sự không muốn nó gặp lỗi OOM Cách tốt nhất để làm điều đó là không bị rò rỉ trong suốt "là hai dòng suy nghĩ chính mà tôi biết.

+0

Tôi nghĩ rằng tôi đã nhận được "lý do" .. thx cho câu trả lời của bạn – drahnr

+0

Lưu ý rằng bạn đang mâu thuẫn với chính mình. Có, hệ điều hành gửi một sự kiện đến trình điều khiển khi dọn dẹp là cần thiết ... nhưng nó vẫn là trình điều khiển thực hiện công việc thực tế, và không dọn dẹp là lỗi của một trình điều khiển bị lỗi. –

+0

@BenVoigt: đã cố gắng làm rõ ý tôi. Điều đó có tốt hơn không? – Bahbar

-1

Trong Opengl, không có bộ nhớ để lưu trữ thông tin bản vẽ. ở đây, khi chúng tôi thực hiện chương trình opengl, thời gian đó gọi phương thức vẽ khung gọi theo tuần tự. Dù sao, nếu chúng ta vẽ một đường thẳng hoặc vòng tròn có nghĩa là, bất cứ lúc nào phương thức vẽ khung gọi của nó để vẽ tại vị trí được chỉ định., Opengl không lưu trữ dòng đó trong bộ nhớ. Bất cứ lúc nào, chỉ bản vẽ của nó. nhưng, khi chúng ta đã thấy, dòng đó đã thành công.

Ví dụ: Trong Android Opengl es2.0 sử dụng lớp trình kết xuất bên trong phương thức drawframe (bên trong phương thức vẽ) để vẽ đường hoặc vòng tròn, v.v. tôi đã sử dụng chương trình Opengl es2.0 này trong việc phát triển ứng dụng autocad android .. nếu bạn muốn xóa các đường được tạo ra bằng cách sử dụng phương thức này trong lớp kết xuất bên trong phương thức onDrawframe 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

Vâng, tất nhiên nó không lưu trữ bất kỳ hình học rút ra, nhưng nó lưu trữ một bó toàn bộ những thứ khác, cả trong bộ nhớ CPU và GPU. Ví dụ tốt nhất, dòng đó được vẽ đến đâu và tại sao bạn có thể thấy nó? –

+0

Xin chào Christian Rau, bạn đã đúng. Tôi nói về bộ nhớ GPU chỉ lưu trữ .. Tôi đang đối mặt với vấn đề cho đề cập ở trên. xin vui lòng xem liên kết này và nếu có thể xin vui lòng giúp tôi từ cuộc đấu tranh này. http://stackoverflow.com/questions/17187032/why-my-opengl-output-differs-for-various-devices Vui lòng xem mã mẫu này cũng từ liên kết này http://tuxbalaji.wordpress.com/2013/06/ 19/draw-a-line-using-opengles2-0-by-touch-sự kiện-trong-android / – harikrishnan

Các vấn đề liên quan