2012-05-22 14 views
5

Tôi đang làm việc trên một ứng dụng C++ OpenGL dựa trên Linux, sử dụng trình điều khiển Nvidia 290.10 64 bit. Tôi đang cố gắng giảm dung lượng bộ nhớ vì nó sử dụng khá nhiều dữ liệu trực tiếp.Sử dụng heap libGL

Tôi đã sử dụng valgrind/massif để phân tích mức sử dụng heap và trong khi nó giúp tôi tối ưu hóa nhiều thứ khác nhau, bây giờ phần lớn nhất bộ nhớ heap được sử dụng được phân bổ bởi libGL. Không có vấn đề làm thế nào tôi thiết lập ngưỡng, massif không cho tôi xem chi tiết nơi mà những phân bổ đến từ, chỉ cần đó là libGL. Vào thời điểm cao điểm, tôi thấy khoảng 250MB được phân bổ bởi libGL (trong tổng số 900MB sử dụng heap). Tôi giữ một lượng bộ nhớ tương tự trên card đồ họa, như VBO và Textures (chủ yếu là một kết cấu lớn 4096 * 4096).

Vì vậy, có vẻ như một lượng bộ nhớ tương tự như những gì tôi tải lên bộ nhớ GPU được phân bổ trên heap bởi libGL. Phân bổ libGL cũng cao nhất khi khối lượng VBO đạt đỉnh. Điều đó có bình thường không? Tôi nghĩ một trong những lợi ích của việc có rất nhiều bộ nhớ GPU là nó giữ RAM miễn phí?

+1

bạn đã chỉ định mức sử dụng nào cho VBO trong 'glBufferData'? – KillianDS

+0

Đối với phần lớn các VBO, đó là GL_STATIC_DRAW. Trong một trường hợp đó là GL_STREAM_DRAW, nhưng hành vi là như nhau ngay cả khi phần này của ứng dụng bị tắt. – pholz

+0

@KillianDS không quan trọng, vì việc sử dụng chỉ là gợi ý, không bắt buộc. Ngoài ra OpenGL phải giữ một bản sao xung quanh vì nhiều lý do. – datenwolf

Trả lời

7

Những gì bạn trải nghiệm là hoàn toàn bình thường, vì triển khai OpenGL phải giữ bản sao dữ liệu trong bộ nhớ hệ thống vì nhiều lý do khác nhau.

Trong OpenGL không có quyền truy cập độc quyền vào GPU, do đó tùy thuộc vào việc sử dụng, nó có thể trở thành cần thiết để trao đổi dữ liệu (hoặc chỉ phát hành một số đối tượng từ bộ nhớ GPU). Ngoài ra, GPU có thể gặp sự cố và trình điều khiển sau đó chỉ im lặng đặt lại chúng mà không cần người dùng nhận thấy. Điều này cũng đòi hỏi một bản sao đầy đủ của tất cả các dữ liệu đệm.

Và đừng quên rằng có sự khác biệt lớn giữa phân bổ không gian địa chỉ (giá trị được báo cáo bởi Valgrind) và sử dụng bộ nhớ thực tế.

+0

Cảm ơn, tôi đã nghi ngờ nó có thể là một cái gì đó như thế. Bây giờ khi RAM được lấp đầy, nó có phải là ít hơn một điều xấu miễn là một phần lớn các phân bổ đến từ libGL? – pholz

+2

pholz: Vâng, libGL chỉ là nơi mã thực hiện phân bổ đến từ, nhưng bộ nhớ được phân bổ hiệu quả theo quy trình phân bổ tài nguyên OpenGL. Và đối với hệ thống, không có sự khác biệt giữa hai. Các hệ điều hành hiện đại cũng không phân biệt giữa RAM và bộ nhớ. Đối với họ, chỉ có "bộ nhớ" và RAM chỉ là một mức bộ nhớ cache khác. Xem bài viết này để giới thiệu rất tốt về cách sử dụng bộ nhớ hiện đại https://www.varnish-cache.org/trac/wiki/ArchitectNotes – datenwolf