2011-12-28 22 views
9

Bir Vertex Arabellek Nesnesi'nin nasıl kullanıldığını ve hemen modda çizim üzerinde büyük bir performans artışı sağladığını anlıyorum. Bir sürü 2D dörtlü (sprite) çizeceğim ve her biri için bir VBO oluşturmam gerektiğini mi yoksa tüm verileri saklamak için bir VBO oluşturmam gerektiğini mi bilmek istiyorum?Kaç tane VBO kullanıyorsunuz?

cevap

17

Her hareketli/dörtlü için yeni bir VBO kullanmamalısınız. Yani hepsini tek bir VBO'ya koymanız, sizin durumunuzda daha iyi bir çözüm olacaktır. Ancak genelde bunun bir cümlede yanıtlanabileceğini düşünmüyorum.

Her bir Quad için yeni bir VBO oluşturmak size gerçek bir performans artışı sağlamamaktadır. Bunu yaparsanız, VBO'ları değiştirmek için glBindBuffer çağrıları ile çok zaman harcanır. Ancak çok fazla veri barındıran VBO'lar oluşturursanız, başka sorunlara da girebilirsiniz.

Küçük VBOS:

  • sık programı kodunda ele kolaydır misiniz. Oluşturduğunuz her Nesne için yeni bir VBO kullanabilirsiniz. Böylelikle, nesnelerinizi dünyasında çok kolay yönetebilirsiniz
  • VBO'lar çok küçükse (sadece birkaç üçgen) çok fazla kazanç elde edemezsiniz. Çok zaman tamponları arasında

Büyük VBOS tamponlarını anahtarlama (ve belki shader/dokular anahtarlama) ile kaybedilir:

  • En iyi performans için tek drawArrays() çağrıyla nesnelerin ton hale getirebilir.
  • Verilerinize bağlı olarak, tek bir VBO'da çok fazla nesneyi yönetmek için ek yük oluşturmanızı sağlayın (bu nesnelerden birini taşımak ve başka bir nesneyi döndürmek isterseniz ne olacak?).
  • sizin VBOS onlar VRAM içine taşınamaz mümkündür onun çok büyükse

Aşağıdaki bağlantılar yardımcı olabilir:

Vertex Specification Best Practices

1

Geometrinizin tümünü/birçoğunu korumak için bir (veya az sayıda) VBO (s) kullanın.

Genelde, daha az API çağrısı, daha iyi bir sahne oluşturmak için alır.

1

Ayrıca istediğiniz d neyi bağlıdır O spritelarla mı?

Dinamik mi? Sadece dörtlü merkezi değiştirmek mi yoksa dört noktayı değiştirmek mi istiyorsunuz?

Bu önemlidir çünkü verileriniz dinamikse, en basit şekilde, cpu'dan her bir kareye gpu aktarmanız gerekir. Belki de tüm hesaplamayı GPU'da gerçekleştirebilirsiniz - örneğin geometri gölgelendiricileri kullanarak?

Ayrıca çok basit dörtlü/sprite için GL_POINT_SPRITE kullanabilirsiniz. Bununla birlikte, tüm dörtlü için sadece bir tepe noktası göndermemiz gerekiyor. Ama dezavantajı, onu döndürmek zor olmasıdır ...

İlgili konular