2011-09-14 14 views
6

Algoritmik olarak geometri oluşturan bir WebGL uygulaması yazıyorum. Geometri, 4-150 nesne arasında, her biri 16 ve 2048 arasında bir noktadan oluşacak ve drawElements aracılığıyla TRIANGLE_STRIP olarak çizilecektir. Geometri, statik çoğu kare olacak, ancak kullanıcı girdisine yanıt olarak animasyonlu olması gerekecektir. Geometri güncellendiğinde bu çerçevelerde, noktalar/tris eklenebilir veya kaldırılabilir. Nesnelerin programın ömrü boyunca eklenmesi/kaldırılması da gerekecektir.WebGL'de etkin VBO ayırma

VBO'ları bu bağlamda ayırmanın/güncelleştirmenin en etkili yolu nedir? Ben her nesneyi güncellemek için DYNAMIC_DRAW ve bufferSubData kullanarak olmalıdır eminim, ama ben (noktalarında başına nesne açısından en kötü durum varsayılarak) birkaç büyük VBOS aşırı tahsis edecek ve bir şekilde her nesneyi tanımlamak istiyoruz Ofset (nesne numarası * nesne başına maksimum boyut) ve daha sonra en iyi durumda ayrılmış çok kullanılan VBO bellek var? Yoksa denemesi gereken başka bir yaklaşım var mı? Ya da aşırı düşünme olduğum hafıza ayak izi açısından bu kadar küçük mü?

cevap

8

VBO'ları bu bağlamda ayırmanın/güncelleştirmenin en etkili yolu nedir? Her nesneyi güncellemek için DYNAMIC_DRAW ve bufferSubData kullanmalıyım.

Bu gerçekten gitmek için bir yoldur. Aslında, nesneleriniz için çift veya üçlü tamponlama kullanmak istersiniz, yani çizim için bir VBO'ya sahip olursunuz, diğerinin içeriğini yeni verilerle güncellersiniz. render iplik geçerli çerçeveyi çizim meşgul durumdayken, "geri" tepe tampon güncellenmesi bir çalışan iş parçacığı olabilir böylece glMapBuffer sonra hafıza haritası, süreçteki tüm evrelerin ulaşılabilir.

Ya da aşırı düşünme olduğum bellek ayak izi açısından bu kadar küçük mü?

Karşılaştığınız en kötü durum bellek izini değerlendirdiniz mi? Rakamlarınız göz önüne alındığında, bunun 16MiB altında olacaktır bahis (150 nesneler * 2048 puan * 3 çift duyarlıklı noktası başına yüzen * çift = 7.4 MiB başına 8 bayt, tek duyarlıklı yüzer kullanılırsa sadece 3.7MiB). RAM modern grafik kartları sunuyoruz ait MiB birkaç yüz karşılaştırın (benim 2006 GeForce 8800GTX 768MiB RAM vardır ve benim Radeon HD6570 1024MiB (= 1GiB).

sahiptir