Đây là một câu hỏi phức tạp với rất nhiều chi tiết nhỏ thực sự quan trọng, hiệu suất sẽ thay đổi dựa trên nền tảng và ứng dụng. Vì vậy, bạn nên lập hồ sơ cho các tắc nghẽn có thể có trước khi đầu tư vào tối ưu hóa.
Điều đó nói rằng, trước tiên, tôi giả sử bạn nên giảm tải lên và cập nhật càng nhiều càng tốt, ví dụ như sử dụng inst instaging.
Thứ hai, lưu ý rằng GPU không thể chuyển bộ đệm và kết xuất cùng một lúc, vì vậy tất cả các lệnh OpenGL trong hàng đợi lệnh được thiết bị xử lý tuần tự. Có nhiều cách khác nhau để sao chép dữ liệu và / hoặc làm cho nó được sử dụng bởi GPU.
Có nhiều cách khác nhau để truyền dữ liệu tới GPU
1- glBufferData
hoặc glBufferSubData
phương pháp
Sử dụng glBufferData
hoặc glBufferSubData
giống như memcpy. bạn truyền con trỏ và thao tác DMA có thể được thực hiện, tôi nói có thể vì bộ nhớ có thể được ghim trong bộ nhớ CPU và được GPU sử dụng trực tiếp mà không thực sự chuyển bộ nhớ sang GPU, tùy thuộc vào cờ sử dụng (GL_STREAM). Theo ý kiến ban đầu, bạn nên thử điều này vì nó đơn giản hơn để thực hiện.
2- nhận được một con trỏ đến bộ nhớ trong bằng cách sử dụng glMapBuffer
Nếu những điều trên không đủ tốt để bạn có thể sử dụng glMapBuffer
, bạn có một con trỏ vào bộ nhớ trong và bạn có thể sử dụng con trỏ này để điền trực tiếp vào bộ đệm, điều này tốt với các thao tác đọc và ghi tệp, vì bạn có thể ánh xạ trực tiếp dữ liệu tệp vào bộ nhớ GPU thay vì sao chép vào bộ đệm tạm thời trước. Nếu bạn không muốn ánh xạ toàn bộ bộ đệm, bạn có thể sử dụngglMapBufferRange
dụng để ánh xạ một phần của bộ đệm.
Một mẹo nhỏ là tạo một bộ đệm lớn, sử dụng nửa đầu để kết xuất và nửa sau để cập nhật.
3- Bộ đệm mồ côi
Về bộ đệm mồ côi, điều này có thể được thực hiện bằng cách sử dụng glBufferData với null và các tham số tương tự như nó có. Trình điều khiển sẽ trả về khối bộ nhớ khi nó không được sử dụng. Và sẽ được sử dụng bởi lệnh gọi glBufferData tiếp theo (không có bộ nhớ mới nào được phân bổ).
Tất cả các phương pháp được đề cập gây ra rất nhiều đồng bộ hóa đắt tiền, một lần nữa GPU không thể chuyển bộ đệm và kết xuất cùng một lúc.
4- Unsynchronized Buffers
Phương pháp nhanh nhất (và khó nhất để có quyền) là sử dụng bộ đệm mà không cần đồng bộ hóa mà bạn có thể sử dụng GL_MAP_UNSYNCHRONIZED_BIT
cờ glMapBufferRange
, vấn đề là không thực hiện đồng bộ hóa, vì vậy chúng tôi có thể tải dữ liệu lên bộ đệm bắt đầu được sử dụng và do đó làm hỏng mọi thứ. Bạn có thể sử dụng nhiều bộ đệm với bit không đồng bộ để làm cho mọi thứ dễ dàng hơn một chút.