Vì vậy, tôi hiểu cách sử dụng một đối tượng Vertex Buffer, và nó cung cấp một sự gia tăng hiệu suất lớn trên bản vẽ chế độ ngay lập tức. Tôi sẽ vẽ rất nhiều quad 2D (sprites), và tôi muốn biết liệu tôi có nên tạo một VBO cho mỗi cái hay tạo một VBO để chứa tất cả dữ liệu không?Tôi sử dụng bao nhiêu VBO?
Trả lời
Bạn không nên sử dụng VBO mới cho mỗi sprite/quad. Vì vậy, đặt tất cả trong một VBO duy nhất sẽ là giải pháp tốt hơn trong trường hợp của bạn.
Nhưng nói chung tôi không nghĩ rằng điều này có thể được trả lời trong một câu.
Tạo VBO mới cho mỗi Quad sẽ không mang đến cho bạn hiệu suất thực sự tăng. Nếu bạn làm như vậy, rất nhiều thời gian sẽ bị lãng phí với glBindBuffer
các cuộc gọi để chuyển đổi các VBO. Tuy nhiên, nếu bạn tạo các VBO giữ quá nhiều dữ liệu, bạn có thể gặp phải các vấn đề khác.
VBOs nhỏ:
- Are thường dễ dàng hơn để xử lý trong mã chương trình của bạn. Bạn có thể sử dụng một VBO mới cho mỗi đối tượng bạn render. Bằng cách này bạn có thể quản lý các đối tượng của mình rất dễ dàng trong thế giới của bạn
- Nếu VBO quá nhỏ (chỉ có một vài hình tam giác), bạn không thu được nhiều lợi ích. Rất nhiều lần sẽ bị mất với chuyển đổi bộ đệm (và có thể chuyển đổi shaders/textures) giữa bộ đệm
VBOs lớn:
- Bạn có thể làm cho tấn của các đối tượng với một
drawArrays()
cuộc gọi duy nhất cho hiệu suất tốt nhất. - Tùy thuộc vào dữ liệu của bạn, bạn có thể tạo phí để quản lý nhiều đối tượng trong một VBO đơn (nếu bạn muốn di chuyển một trong các đối tượng này và xoay đối tượng khác?).
- Nếu VBOs của bạn quá lớn của nó có thể là họ không thể di chuyển vào VRAM
Các liên kết sau đây có thể giúp bạn:
Sử dụng một (hoặc một số ít) VBO (s) để giữ tất cả/hầu hết hình của bạn.
Nói chung, càng ít lệnh gọi API để hiển thị cảnh của bạn thì càng tốt.
Nó cũng phụ thuộc những gì bạn muốn d làm gì với những sprites?
Chúng có động không? Bạn có muốn thay đổi chỉ là trung tâm của quad hoặc có thể sửa đổi tất cả bốn điểm?
Điều này quan trọng bởi vì nếu dữ liệu của bạn là động thì, theo cách đơn giản nhất, bạn sẽ phải chuyển từ cpu sang gpu từng khung hình. Có lẽ bạn có thể thực hiện tất cả tính toán trên GPU - ví dụ bằng cách sử dụng trình tạo bóng hình học?
Cũng dành cho tứ giác/sprites rất đơn giản, người ta có thể sử dụng GL_POINT_SPRITE. Với một trong đó cần phải gửi chỉ có một đỉnh cho toàn bộ quad. Nhưng nhược điểm là rất khó xoay nó ...
- 1. Tôi nên sử dụng bao nhiêu hoạt động?
- 2. Tôi có thể sử dụng bao nhiêu Java với GWT?
- 3. Bao nhiêu là PhoneGap được sử dụng
- 4. Có bao nhiêu số ngẫu nhiên std :: uniform_real_distribution sử dụng?
- 5. Java: vòng lặp trống sử dụng bao nhiêu thời gian?
- 6. Bao nhiêu bộ nhớ vm có thể sử dụng
- 7. Con trỏ C++ sử dụng bao nhiêu bộ nhớ?
- 8. Sự cố khi sử dụng VBO
- 9. Có bao nhiêu chủ đề tôi có thể sinh ra bằng cách sử dụng tăng C++?
- 10. Tìm hiểu xem có bao nhiêu người sử dụng phần mềm của tôi
- 11. Mô-đun hạt nhân của tôi sử dụng bao nhiêu bộ nhớ?
- 12. Làm thế nào để tôi tìm được bao nhiêu không gian TFS đang sử dụng
- 13. Tôi có thể tạo bao nhiêu phiên bản System.Timers.Timer? Tôi có thể mở rộng bao xa?
- 14. Bao nhiêu PHP bao gồm quá nhiều?
- 15. Tôi có thể dựa vào GUID trong .Net bao nhiêu?
- 16. Có bao nhiêu LINQ?
- 17. GUID ngắn bao nhiêu?
- 18. Chuỗi java của tôi mất bao nhiêu bộ nhớ?
- 19. Có bao nhiêu child_processes tôi nên fork() trong node.js?
- 20. Tôi mất bao nhiêu tiền để chọn ASP.NET trên PHP?
- 21. Khung của tôi nên có bao nhiêu thư mục?
- 22. Tôi có thể gửi bao nhiêu dữ liệu qua socket.emit?
- 23. MSDTC - cần bao nhiêu cổng
- 24. Phiên Meteor bao nhiêu là
- 25. Android tôi có thể đi bao nhiêu chủ đề?
- 26. Làm thế nào tôi có thể tìm thấy bao nhiêu năng lượng máy tính của tôi đang sử dụng?
- 27. Có bao nhiêu lần tôi có thể sử dụng randomGenerator.nextDouble() trước khi tôi cần phải gieo hạt lại?
- 28. Tôi nên đặt bao nhiêu lớp vào một tệp?
- 29. Có bao nhiêu Threads trong phương thức của tôi?
- 30. Tôi có thể kết hợp với nhau bao nhiêu cụm từ thông dụng bằng cách sử dụng luân phiên?