Với VBO bạn thường có hai lợi thế lớn.
Ưu điểm 1 liên quan đến dữ liệu tĩnh hoàn toàn và xuất phát từ việc có thể giữ dữ liệu đỉnh của bạn trong bộ nhớ tối ưu hơn cho GPU.
Ưu điểm 2 liên quan đến dữ liệu động và xuất phát từ việc có thể chỉ định dữ liệu đỉnh của bạn tại bất kỳ thời điểm nào trước khi sử dụng nó để kết xuất, có thể dẫn đường tốt hơn.
Một lợi thế thứ ba đến từ việc phân nhóm cuộc gọi rút thăm, nhưng cũng được chia sẻ với các mảng đỉnh của trường học cũ vì vậy tôi không gọi nó là đặc biệt cho VBO. Gửi dữ liệu tới GPU (hoặc sử dụng dữ liệu đã có trên GPU) tương tự như nhiều cách để vào I / O và lưu lượng mạng - nếu bạn có một vài lô lớn thì hiệu quả hơn nhiều đợt nhỏ.
Một sự tương tự tốt (không chính xác 100% nhưng đủ để giúp bạn có ý tưởng) tương tự như vậy nếu bạn là tài xế xe buýt phải đưa 50 người từ thành phố này sang thành phố khác. Bạn có thể tải chúng lên từng cái một và thực hiện 50 chuyến đi riêng biệt - đó là glBegin / glEnd. Ngoài ra, bạn có thể đặt tất cả 50 người trong số họ lên xe buýt và chỉ thực hiện một chuyến đi - đó là việc tạo ra các mảng đỉnh hoặc VBO (trong trường hợp VBO, 50 người sẽ ở trên xe buýt;)).
Điều này có giá mặc dù, và ở đây giá là bạn mất khả năng chỉ định dữ liệu đỉnh và khi bạn yêu cầu. Chà, OK, bạn có thể làm điều đó (với một số công việc bổ sung), nhưng bạn sẽ không nhận được hiệu suất đầy đủ từ mã của mình. Thay vào đó, bạn cần suy nghĩ nhiều hơn về dữ liệu đỉnh của mình, cách sử dụng, cách thức (và nếu) nó cần được cập nhật, liệu có thể thực hiện bất kỳ hoạt ảnh nào trong trình đổ bóng hay không (do đó cho phép dữ liệu duy trì trạng thái tĩnh - VBO thực sự cần shader cho rất nhiều trường hợp hoạt hình để hoạt động tốt) hoặc cho dù bạn cần bảo vệ dữ liệu đỉnh mỗi khung, chiến lược cập nhật hiệu quả nếu sau này, v.v. Nếu bạn không làm điều này và chỉ thực hiện chuyển đổi ngây thơ, bạn có nguy cơ rất cao khi đặt trong rất nhiều công việc chỉ để kết quả cuối cùng thực sự chạy chậm hơn!
Điều này có vẻ như là rất nhiều công việc khi bạn lần đầu tiên gặp nó, nhưng thực sự không phải vậy. Khi bạn bước vào chế độ suy nghĩ như thế này, bạn sẽ thực sự thấy rằng nó cực kỳ dễ dàng và gần như đến một cách tự nhiên. Nhưng bạn có thể làm hỏng vài lần thử đầu tiên của mình và bạn không nên nản lòng nếu vậy - vặn vẹo là một cơ hội để học hỏi từ những gì bạn đã làm sai.
Một vài suy nghĩ cuối cùng.
Có dữ liệu mô hình của bạn ở định dạng có thể dễ dàng tải vào VBO có thể giúp làm cho toàn bộ quá trình này dễ dàng hơn cho bạn. Điều đó có nghĩa là bạn nên tránh các định dạng phức tạp hoặc kỳ lạ hơn, ít nhất là vào lúc đầu (và cho đến khi bạn cảm thấy thoải mái hơn với quy trình này); giữ mọi thứ đơn giản và cơ bản nhất có thể khi học và sẽ có ít sai sót hơn và ít nơi phải tìm lỗi nếu (hoặc khi nào!) xảy ra lỗi.
Mọi người đôi khi bị trì hoãn nếu họ thấy một triển khai VBO sử dụng nhiều bộ nhớ hơn so với triển khai glBegin / glEnd được tối ưu hóa / nén (thậm chí họ có thể gọi nó là "lãng phí"). Đừng như vậy. Ngoại trừ trong trường hợp nghiêm trọng, sử dụng bộ nhớ thực sự không mà quan trọng. Đây là một sự đánh đổi rõ ràng ở đây - bạn chấp nhận sử dụng bộ nhớ có khả năng cao hơn để đổi lấy hiệu năng cao hơn đáng kể. Cũng giúp phát triển tư duy rằng bộ nhớ là một nguồn tài nguyên rẻ và dồi dào đang được sử dụng; hiệu suất thì không.
Và cuối cùng là hạt dẻ cũ - nếu nó đã đủ nhanh thì công việc của bạn đã hoàn thành. Nếu bạn đang đạt tốc độ khung hình mục tiêu, nếu bạn có khoảng trống trong điều kiện nhất thời, thì nó đủ tốt và bạn có thể chuyển sang bước tiếp theo. Bạn có thể lãng phí rất nhiều thời gian và năng lượng để vắt kiệt thêm 10% trong số những thứ không thực sự cần nó (đã ở đó, thực hiện được điều đó, vẫn rơi vào bẫy) vì vậy hãy luôn xem xét việc sử dụng thời gian tối ưu nhất của bạn là gì - bởi vì thời gian lập trình viên thậm chí còn rẻ hơn và kém hơn so với hiệu suất!