2009-10-13 42 views

Trả lời

5

Bạn có thể lưu trữ nhiều mắt lưới trong một bộ đệm đỉnh. Bạn có thể đạt được một số hiệu suất bằng cách đặt một số mắt lưới nhỏ trong một bộ đệm. Đối với các mắt lưới thực sự lớn, bạn nên sử dụng bộ đệm riêng biệt. SetStreamSource cho phép bạn chỉ định độ lệch vùng đệm đỉnh cho lưới hiện tại của bạn.

pRawDevice->SetStreamSource(0, m_VertexBuffer->GetBuffer(), m_VertexBuffer->GetOffset(), m_VertexBuffer->GetStride()); 
-2

Với OpenGL, bạn có thể sử dụng glVertexPointer() để bắt đầu vẽ từ một khoảng bù nhất định bên trong VBO. không chắc chắn về D3D.

2

TBH thường là lý do để đặt tất cả trong một bộ đệm lớn là lưu vào cuộc gọi vẽ. Chi phí chuyển đổi một bộ đệm đỉnh là khá nhỏ. Nếu bạn có thể hợp nhất tất cả chúng thành 1 vertex buffer và render 10 đối tượng trong 1 draw call thì bạn sẽ có một chiến thắng lớn.

Thông thường để hợp nhất chúng, bạn chỉ cần tạo 1 bộ đệm đỉnh lớn với tất cả các dữ liệu đỉnh, đã được thế giới chuyển đổi trong nó, cái khác. Sau đó, bạn thiết lập một bộ đệm chỉ mục để hiển thị chúng lần lượt. Sau đó, bạn có mọi thứ vẽ trong các cuộc gọi vẽ tối thiểu. Tất nhiên nếu bạn di chuyển một thứ đòi hỏi phải cập nhật một phần của bộ đệm đỉnh, đó là lý do tại sao nó là một tình huống lý tưởng cho hình học tĩnh.

Nếu tất cả các đối tượng giống nhau, bạn sẽ chỉ sử dụng 1 bộ đệm đỉnh (với 1 định nghĩa đối tượng trong đó) và 1 bộ đệm chỉ mục đúng không? Ma trận di chuyển hoặc tạo hiệu ứng đối tượng ...

Nếu tất cả các đối tượng khác nhau và di chuyển/hoạt hình thì tôi chỉ cần gắn với các VB riêng lẻ. Tôi nghi ngờ bạn sẽ nhận thấy bất kỳ sự khác biệt bằng cách kết hợp tất cả chúng lại với nhau.

0

Vâng, kinh nghiệm của tôi là nó không tạo ra sự khác biệt nhiều như vậy miễn là bộ đệm của bạn không thực sự nhỏ hoặc thực sự lớn. Tôi nghi ngờ rằng bất kỳ không hiệu quả trong việc chuyển đổi bộ đệm sẽ được kết hợp bởi sự gia tăng hiệu quả bằng cách cho người lái nhiều operatunities để quản lý bộ nhớ của nó với bộ đệm nhỏ hơn.

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