Câu trả lời đúng nhất là, nó phụ thuộc vào cách bạn lập trình nó, nhưng đây là một điều tốt để lo lắng. Mặc dù GPU đã trở nên cực kỳ nhanh, băng thông đến và từ RAM GPU thì không, và sẽ là nút cổ chai khó chịu nhất của bạn.
Dữ liệu của nó có được gửi đến bộ nhớ GPU chỉ một lần và ngồi đó mãi mãi không?
Có hy vọng. Đối với tốc độ kết xuất, bạn muốn có càng nhiều dữ liệu trên GPU càng tốt, thay vì gửi lại mỗi khung hình. VBO phục vụ mục đích chính xác này. Có cả VBO tĩnh và động, trước đây là tốt nhất cho các mô hình tĩnh và sau là tốt nhất cho các mô hình có các đỉnh sẽ thay đổi mọi khung hình (giả sử, một hệ thống hạt). Tuy nhiên, ngay cả khi nói đến VBO động, bạn không muốn gửi lại tất cả các đỉnh mỗi khung; chỉ là những người đang thay đổi.
Trong trường hợp tòa nhà của bạn, dữ liệu đỉnh sẽ chỉ nằm ở đó và điều duy nhất thay đổi là ma trận của bạn (mô hình / thế giới, hình chiếu và chế độ xem).
Trong trường hợp hệ thống hạt, tôi đã tạo ra một VBO động đủ lớn để lưu trữ số lượng hạt tối đa sẽ tồn tại cho hệ thống đó. Mỗi khung tôi gửi dữ liệu cho các hạt phát ra khung đó, cùng với một vài đồng phục, và đó là tất cả. Khi tôi vẽ, tôi có thể chỉ định điểm bắt đầu và điểm kết thúc trong VBO đó, vì vậy tôi không phải xóa dữ liệu hạt. Tôi chỉ có thể nói đừng vẽ chúng.
Khi mô hình thực sự được hiển thị mỗi khung hình, bộ xử lý GPU có phải tìm nạp dữ liệu của nó mỗi lần từ bộ nhớ GPU không? Ý tôi là - nếu tôi có 2 mô hình được kết xuất nhiều lần mỗi lần - sẽ là vấn đề nếu lần đầu tiên tôi kết xuất lần đầu tiên nhiều lần và sau đó lần thứ hai nhiều lần hoặc nếu tôi kết xuất lần đầu tiên chỉ một lần, lần thứ hai chỉ một lần và cứ xen kẽ như thế?
Hành động gửi nhiều cuộc gọi rút thăm thay vì chỉ một cuộc gọi là một giới hạn lớn hơn nhiều. Kiểm tra kết xuất đồ họa; nó có thể giúp bạn rất nhiều và làm cho câu trả lời cho câu hỏi này trở nên vô dụng. Tôi đã có một số vấn đề về trình điều khiển với nó mà tôi chưa giải quyết được, nhưng nếu bạn có thể làm cho nó hoạt động, thì vấn đề đã được giải quyết.
Rõ ràng các card đồ họa có RAM hạn chế - khi nó không thể chứa tất cả dữ liệu mô hình cần thiết để hiển thị 1 khung hình, tôi đoán nó tiếp tục tìm nạp (một số) nó từ RAM CPU mỗi khung hình, điều đó có đúng không?
Bạn không muốn hết RAM GPU. Nếu bạn làm, sau đó thay đổi mọi thứ để bạn không. Trong kịch bản rất giả thuyết là bạn hết, có thể nó sẽ sụp đổ bằng cách nào đó, nhưng tôi chưa bao giờ thấy nó xảy ra nên tôi thực sự không biết.
Tôi đã quên phân biệt: có gửi dữ liệu tới GPU và cài đặt / ràng buộc bộ đệm như hiện tại. Liệu cái sau gây ra bất kỳ luồng dữ liệu?
Không có bất kỳ luồng dữ liệu quan trọng, không. Có một số chi phí cho nó, nhưng điều đó đúng với mọi dòng mã bạn viết. Tìm hiểu xem chi phí của bạn là bao nhiêu, một lần nữa, hồ sơ là để làm gì.
tạo bộ đệm với khởi tạo
Câu trả lời của Raxvan nghe có vẻ hay, nhưng nó không hoàn toàn chính xác. Trong OpenGL, việc tạo bộ đệm không dành bất kỳ khoảng trống nào. Nếu bạn muốn dự trữ dung lượng mà không truyền bất kỳ dữ liệu nào, bạn có thể gọi glBufferData và chỉ cần truyền null. (Xem phần ghi chú ở đây .)
cập nhật dữ liệu đệm
Tôi đoán bạn có nghĩa là glBufferData, hoặc các chức năng khác như vậy, phải không? Đây là nơi chuyển dữ liệu thực sự xảy ra. (Trừ khi bạn vượt qua null, như tôi vừa nói ở đoạn cuối.)
ràng buộc bộ đệm là hoạt động (nó chỉ là một cách để nói với API rằng tôi muốn bộ đệm này được hiển thị trong lệnh gọi tiếp theo và nó không tự làm gì cả?)
Vâng, nhưng nó có thể làm nhiều hơn thế. Ví dụ: nếu bạn liên kết VAO (đối tượng mảng đỉnh), sau đó liên kết VBO, VBO đó sẽ bị ràng buộc với VAO. Sau đó, nếu bạn liên kết lại VAO đó và gọi glDrawArrays, nó sẽ biết VBO sẽ vẽ gì.
Lưu ý rằng mặc dù nhiều hướng dẫn sẽ giúp bạn tạo VAO cho mỗi VBO, nhưng tôi được cho biết đây không phải là mục đích sử dụng của họ. Giả sử bạn nên tạo một VAO và sử dụng nó với mọi VBO có cùng thuộc tính. Tôi chưa thử điều này, vì vậy tôi không thể chắc chắn liệu nó tốt hơn hay xấu đi.
Cuộc gọi vẽ API
Những gì xảy ra ở đây là khá đơn giản (từ quan điểm của chúng tôi). Giả sử bạn liên kết VAO, sau đó gọi glDrawArrays. Bạn chỉ định một điểm bắt đầu và một số đếm, và nó chạy trình tạo bóng đỉnh của bạn cho mọi đỉnh trong phạm vi đó, lần lượt chuyển các đầu ra của nó xuống dòng. Toàn bộ quá trình đó là một bài luận khác của riêng mình, mặc dù.