2011-12-28 34 views
9

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

17

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:

Vertex Specification Best Practices

1

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.

1

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ó ...

Các vấn đề liên quan