GL_STATIC_DRAW so với GL_DYNAMIC_DRAW so với GL_STREAM_DRAW: có vấn đề gì không?


11

Trong OpenGL, các hàm đối tượng bộ đệm ( glBufferData, glBufferSubDatavà có thể là một vài hàm khác) có một tham số usage, được mô tả bởi tài liệu này như một gợi ý về cách sử dụng dự định, có khả năng giúp triển khai mang lại hiệu suất tốt hơn.

sử dụng

Chỉ định mô hình sử dụng dự kiến ​​của kho lưu trữ dữ liệu. Hằng số biểu tượng phải có GL_STREAM_DRAW, GL_STREAM_READ, GL_STREAM_COPY, GL_STATIC_DRAW, GL_STATIC_READ, GL_STATIC_COPY, GL_DYNAMIC_DRAW, GL_DYNAMIC_READ, hoặc GL_DYNAMIC_COPY.
[...]
Việc sử dụng là một gợi ý cho việc triển khai GL về cách lưu trữ dữ liệu của đối tượng bộ đệm. Điều này cho phép thực hiện GL để đưa ra các quyết định thông minh hơn có thể ảnh hưởng đáng kể đến hiệu suất của đối tượng bộ đệm. Tuy nhiên, nó không hạn chế việc sử dụng thực tế của kho lưu trữ dữ liệu.

Wiki cũng tương tự mơ hồ:

Đây chỉ là những gợi ý. Đó là mã OpenGL hoàn toàn hợp pháp để sửa đổi bộ đệm STATIC sau khi được tạo hoặc không bao giờ sửa đổi bộ đệm STREAM.
[...]
Đây là những câu hỏi chỉ có thể được trả lời với hồ sơ cẩn thận. Và thậm chí sau đó, câu trả lời sẽ chỉ chính xác cho phiên bản trình điều khiển cụ thể đó từ nhà cung cấp phần cứng cụ thể đó.

Trong tiền phạt, tham số này có liên quan như thế nào, nếu có? Các trình điều khiển có thực sự tính đến nó không, và nếu có, theo kinh nghiệm của bạn, nó ảnh hưởng đến hiệu suất trong thực tế đến mức nào? Bạn có dữ liệu để chia sẻ?

Tôi đã viết một lớp trừu tượng API đồ họa mỏng có nghĩa là được triển khai như một trong các API hiện có và thật tuyệt vời khi chỉ cần bỏ qua tham số này hoàn toàn và ẩn nó khỏi sự trừu tượng bị lộ.

Câu trả lời:


7

Điều này sẽ khác nhau giữa các lần triển khai, nhưng trình điều khiển mà tôi đã làm việc đã sử dụng chúng, chủ yếu để quyết định bố cục bộ nhớ. Các tối ưu hóa được kích hoạt bởi các gợi ý này nhỏ hơn nhiều so với bạn muốn, chủ yếu là do các hạn chế mà bạn có thể thực hiện bất kỳ việc sử dụng bất kỳ gợi ý nào bạn đưa ra. ví dụ, nó sẽ làm cho việc vô hiệu hóa bộ đệm rẻ hơn rất nhiều nếu bộ đệm gợi ý cho việc truy cập đọc chỉ không thể được viết, nhưng tối ưu hóa này là không thể.

Một số trò chơi đáng chú ý được sử dụng rộng rãi để so sánh điểm chuẩn giữa các GPU không sử dụng các gợi ý này một cách chính xác, vì vậy các nhà cung cấp GPU có động cơ để làm cho tất cả sử dụng nhanh ngay cả khi chúng không khớp với các gợi ý.


4

Về mặt chức năng chúng giống nhau.

Người lái xe có thể sử dụng chúng để phân biệt cách xử lý bộ đệm phía sau hậu trường. Ví dụ, nơi static_draw sẽ được sao chép vào vram càng sớm càng tốt và để lại ở đó nhưng stream_read sẽ có một bản sao cập nhật trong RAM mọi lúc.

Sự mơ hồ này là lý do mà glBufferStorage trở thành một thứ. Bằng cách đó, bạn chỉ định những gì bạn muốn có thể thực hiện với bộ đệm (cho dù bạn sẽ cập nhật nó thông qua BufferSubData, cho dù bạn sẽ đọc hoặc viết qua bản đồ, cách ánh xạ mạch lạc, liệu ánh xạ có thể tiếp tục sử dụng hay không) và đi ra ngoài những ranh giới đó là một lỗi.

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.