2011-09-14 38 views
6

Tôi đang viết một ứng dụng WebGL tạo thuật toán hình học. Hình học sẽ bao gồm từ 4-150 đối tượng, mỗi đối tượng bao gồm khoảng từ 16 đến 2048 điểm, được vẽ dưới dạng TRIANGLE_STRIP thông qua drawElements. Hình học sẽ là hầu hết các khung hình tĩnh, nhưng sẽ cần phải hoạt ảnh để phản hồi lại đầu vào của người dùng. Trong các khung hình này khi hình học được cập nhật, các điểm/tris có thể được thêm vào hoặc loại bỏ. Các đối tượng cũng sẽ cần được thêm/xóa trong suốt thời gian tồn tại của chương trình.Phân bổ VBO hiệu quả trong WebGL

Cách hiệu quả nhất để phân bổ/cập nhật VBO trong ngữ cảnh này là gì? Tôi khá chắc chắn tôi nên sử dụng DYNAMIC_DRAW và bufferSubData để cập nhật từng đối tượng, nhưng tôi có muốn phân bổ quá mức một số lượng lớn VBO (giả sử trường hợp xấu nhất về điểm cho mỗi đối tượng) và xác định từng đối tượng dưới dạng bù đắp (đối tượng số * kích thước tối đa cho mỗi đối tượng) và sau đó có rất nhiều phân bổ không được sử dụng bộ nhớ VBO trong trường hợp tốt nhất? Hoặc có cách tiếp cận khác tôi nên thử? Hay điều này đủ nhỏ về mặt bộ nhớ mà tôi đang suy nghĩ quá mức?

Trả lời

8

Cách hiệu quả nhất để phân bổ/cập nhật VBO trong ngữ cảnh này là gì? Tôi khá chắc chắn tôi nên sử dụng DYNAMIC_DRAW và bufferSubData để cập nhật từng đối tượng.

Đây thực sự là cách để thực hiện. Trên thực tế, bạn muốn sử dụng bộ đệm đôi hoặc thậm chí gấp ba lần cho các đối tượng của mình, tức là có một VBO bị ràng buộc để vẽ, trong khi bạn cập nhật nội dung kia với dữ liệu mới. Sau glMapBuffer bản đồ bộ nhớ có thể được truy cập từ tất cả các luồng trong quá trình, do đó bạn có thể có một chuỗi công nhân cập nhật bộ đệm đỉnh "lưng", trong khi chuỗi hiển thị bận vẽ khung hiện tại.

Hoặc điều này đủ nhỏ về mặt bộ nhớ mà tôi đang suy nghĩ quá mức?

Bạn có đánh giá dấu vết bộ nhớ trường hợp xấu nhất mà bạn đang xử lý không? Với số của bạn, tôi đặt cược nó sẽ dưới 16MiB (150 đối tượng * 2048 điểm * 3 phao chính xác gấp đôi cho mỗi điểm * 8 byte mỗi đôi = 7,4 MiB, chỉ 3,7MiB nếu phao chính xác đơn được sử dụng). So sánh điều này với hàng trăm chiếc thẻ đồ họa hiện đại RAM của MiB cung cấp (2006 GeForce 8800GTX của tôi có RAM 768MiB, và Radeon HD6570 của tôi có 1024MiB (= 1GiB)

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