OpenGL> = 3 neden sadece VBO'lara izin veriyor?


21

OpenGL sürüm 3 ve üstü sürümlerin istemci tarafı oluşturma kullanımını ortadan kaldırdığını görüyorum. Acil durum modu elimine edildi ve tepe dizileri kullanımdan kaldırılmış görünüyor. Bunun yerine, doğru anlarsam VBO, köşeleri dönüştürmenin ana yoludur.

Her şeyin tek tipini oluşturmanın tek yolunun ardındaki mantığı görsem de, VBO'ların tepe dizileri üzerinde büyük bir dezavantajı yok mu? VBO'ların genellikle> 1 MB veri içeren büyük tamponlar olduğunu sanıyordum. Çok daha küçük geometriye sahip bir sahnem varsa ne olur? Her biri kendi dönüşümüne vb. İhtiyaç duyan çok sayıda düğüme sahip bir sahne grafiğim var. Her düğüm ayrıca ayrı ayrı silinebilmeli, ayrı ayrı ekleyebilmeliydi, vb. Daha önce köşe dizileri kullanmıştım. Bu yüzden ilk sorum, eğer VBO'lara geçersem, artık sahne grafiği nesnelerime daha büyük bir ek yük olup olmayacağıdır, çünkü her nesneye bir VBO tahsis edilmesi gerekiyor.

Diğer bir endişe, oluşturduğum geometrinin oldukça dinamik olabilmesi. En kötü durumda, tüm geometrilerin bir süre boyunca her kareye yeniden gönderilmesi gereken zamanlar olabilir. Bu kullanım durumunda VBO'lar verteks dizilerden daha kötü bir performansa sahip olacak mı, yoksa en kötü VBO'lar verteks dizileri kadar işe yarıyor mu?

Yani, özlü biçimde, sorularım:

1) VBO'ların tahsis edilmesi / ayrılması için önemli bir ek yük var mı (sadece bir tampon ayarlama eylemi demek istiyorum)?

2) Verileri CPU'dan her karede güncellersem, bu vertex dizileri kullandığımdan daha kötü olabilir mi?

Sonunda bilmek isterdim:

3) Yukarıdaki sorulardan herhangi birinin cevabı "evet" ise, neden VBO'lara göre avantajları olabilecek diğer render tarzlarını reddetmelisiniz? Burada kaçırdığım bir şey var mı, bu potansiyel tahsisat maliyetlerinin bir kısmını azaltmak için kullanmam gereken teknikler gibi?

4) Bu sorulardan herhangi birinin cevapları, hangi OpenGL sürümünü kullandığıma bağlı olarak değişiyor mu? Kodumu VBO'ları performans gösterecek şekilde kullanarak ileriye dönük olarak OpenGL 3 veya 4 olarak yeniden uyarsam, aynı tekniklerin OpenGL 2 ile iyi performans göstermesi ya da OpenGL 3 ile belirli tekniklerin çok daha hızlı olması muhtemel olacak mı? + ve OpenGL 2'li diğerleri?

Bu soruyu yığın taşması hakkında sordum, ancak bu sitenin soruma daha uygun olabileceğini düşündüğüm için buraya yeniden gönderiyorum.


1
Neden bir oy kapatılmalı? Dup mi? Öyleyse, bundan faydalanabilmem için bir bağlantı görebilir miyim?
Yerçekimi

Yanıtlar:


23

VBO'ları tahsis etmek / tahsis etmek için önemli bir ek yük var mı (bir tampon ayarlama eylemi demek istiyorum)?

"Önemli" tanımlayın. Bunları çerçevelerin ortasında oluşturmamak genellikle akıllıca olacaktır; başlatma sırasında veya her yerde kurulmalıdırlar. Ancak bu, dokular, görüntü oluşturucular veya gölgelendiriciler gibi birçok OpenGL nesnesi için geçerlidir.

İşlemcideki verileri her karede güncelliyorsam, bu vertex dizileri kullandığımdan çok daha kötü olabilir mi?

Olabilir mi? Evet. OpenGL, performansı değil işlevselliği tanımlar . Gerçekten işleri daha yavaş yapabilirsiniz. Veya işleri daha hızlı yapabilirsiniz. Hepsi nasıl kullandığınıza bağlı.

OpenGL Wiki, verilerin doğru şekilde nasıl akışlandırılacağına dair iyi bir makaleye sahiptir .

Yukarıdaki sorulardan herhangi birine cevabınız "evet" ise, neden VBO'lara göre avantajları olabilecek diğer render tarzlarını reddetmelisiniz? Burada kaçırdığım bir şey var mı, bu potansiyel tahsisat maliyetlerinin bir kısmını azaltmak için kullanmam gereken teknikler gibi?

İlk önce, sadece itiraz edilmediler. İtiraz, gelecekteki sürümlerde "kaldırılacak" olarak işaretlemek anlamına gelir. 3.0'da kullanımdan kaldırıldı ve 3.1 çekirdek ve üstünden çıkarıldı .

İkincisi, ARB genellikle işleri OpenGL'den kaldırma nedenini açıkladı. Özelliği daha küçük ve daha basit hale getirir. API'yi daha küçük ve daha düzenli hale getirir. Hangi API’leri kullanmanız gerektiğini bilmenizi kolaylaştırır; 2.1 köşe verilerini sağlamak için 4 yol vardı; 3.1 + 1 var. Çok fazla zorlukla kurtulur. Vb.

Bu sorulardan herhangi birinin cevapları, hangi OpenGL sürümünü kullandığıma bağlı olarak büyük ölçüde değişiyor mu? Kodumu VBO'ları performans gösterecek şekilde kullanarak ileriye dönük olarak OpenGL 3 veya 4 olarak yeniden uyarsam, aynı tekniklerin OpenGL 2 ile iyi performans göstermesi ya da OpenGL 3 ile belirli tekniklerin çok daha hızlı olması muhtemel olacak mı? + ve OpenGL 2'li diğerleri?

Az ya da çok hayır. Yalnızca MacOSX'te 3.1 + çekirdek ve 3.0 öncesi sürümler arasındaki fark gerçekten de açıkça görülüyor. Uyumluluk profili, Linux ve Windows için tüm sürücüler tarafından uygulanır; bu nedenle, bu sürücülerden gelen çekirdek profilin, uyumluluk işlevlerini çağırmanızı engellemek için yalnızca kontroller eklediğini varsayabilirsiniz.

Mac OS X 10.7 altında, GL 3.2 çekirdek kullanılabilir, ancak değil uyumluluk profili. Bu mutlaka bir başkasına göre performans teknikleri için bir şey ifade etmez . Ancak, eğer farklılıklar varsa, bu onları göreceğiniz platformdur.


1
Siz sadece bu soruyu çapraz gönderdiğinizden beri , cevabımı çapraz göndereceğim .
Nicol Bolas

API'yı kısa tutmanın bir başka avantajı OpenGL API'sinin uygulanmasını kolaylaştırmasıdır. Bu, orijinal OpenGL ES özelliklerinde büyük bir düşünceydi.
Ocak'ta 12:41

@ Stephelton: Mantıklı. Benim "neden her şeyi VBO'lar dışında bıraktığım" sorusu, API'yi yalın tutmak için mükemmel bir anlam ifade etse de, birçok kullanım durumunda VBO'lardan daha iyi olabilecek özelliklerin kullanımdan kaldırılmasının bir anlamı olmadığını düşünmeme dayanıyor. Duyduğuma göre, VBO'ları kullanmanın hiçbir dezavantajı yok gibi görünüyor, bu yüzden, o zaman diğer her şeyi mahrum etmek mükemmel bir anlam ifade ediyor.
Yerçekimi

@gravity Sen yok olması VBO kullanmasına. Bir dizi köşeyi de kullanabilirsiniz.
12'de

18

OpenGL'nin çalışma şekli, ne zaman VBO dışı veri kullanıyorsanız, sürücünün bir kopyasını çıkarması gerekir - pratikte geçici bir VBO yaratma - çünkü hiçbir şey sizi boş alandaki çıplak dizilerinizi OpenGL'ye çağrılar arasında değiştirmekten alıkoyamaz.

Sıcaklık tahsisini daha hızlı hale getirmek için sürücü tarafında bir hile olabilir, ancak kopyalamayı önlemek için yapabileceğiniz hiçbir şey yoktur.

Yani, evet - siz ve sürücü geliştiriciler - her şeyi doğru yaptığınız sürece, VBO'lar (tm) her zaman sadece işleri hızlandırmalıdır.


6
Bu cevabı daha çok seviyorum. Bu noktaya kadar daha kısa ve daha fazla, imo.
TravisG,

@ JariKomppa: Çok makul bir açıklama gibi geliyor. Hala bir endişem var: VBO'ların, son kontrol ettiğimde genellikle 1MB - 4MB arabellek olarak tahsis edilen oldukça büyük nesneler olduğu varsayılıyor. Ya geometri nesnelerim o kadar büyük değilse, ama çok fazla nesnem olduğu için hala performans konusunda endişeliyim? VBO'ların sahip olduklarımdan farklı bir kullanım olabileceği konusunda endişeliyim. Birden fazla nesneyi tek bir VBO'da bir araya getirmeli ve sonra glDrawRangeElementsher bir nesneyi çizmek için kullanmalı mıyım , yoksa verteks dizileri gibi verimsiz mi?
Yerçekimi

Bunun bir fark yaratacağından şüpheliyim, ancak bir sorun olduğunu düşünüyorsanız, kıyaslayın.
Jari Komppa

@JariKomppa: Fark yaratacağınızdan şüpheniz var mı? glDrawRangeElementsHer nesneye kendi VBO'sunu vermek yerine, her VBO'da birkaç VBO ile birden çok kez kullanma ?
Yerçekimi

1
Kesinlikle. Orada çok fazla fark göreceğinizi sanmıyorum, ancak bazı test durumlarının profillenmesi size daha fazla bilgi vermelidir. Ayrıca şimdi endişelenmem, böyle bir değişiklik gerektiğinde daha sonra uygulanabileceği için.
Jari Komppa

9

ve tepe dizileri kullanımdan kaldırılmış gibi görünüyor. Bunun yerine, doğru anlarsam,

Tam değil. Köşe dizileri, köşe arabelleği nesnelerinin temelini oluşturur. Yalnızca depolama alanı istemciden sunucu tarafına taşındı.

Çok daha küçük geometriye sahip bir sahnem varsa ne olur?

Küçük geometri kümelerini daha büyük VBO'larda birleştirin. Geometri toplu başına bir VBO olmasına gerek yoktur. Oluşturmak için bir VBO alt kümesini mükemmel bir şekilde adresleyebilirsiniz. Gl… Pointer veri parametresi için nonzereo ofset kullanın.

2) Verileri CPU'dan her karede güncellersem, bu vertex dizileri kullandığımdan daha kötü olabilir mi?

Bunun için GL_DYNAMIC_DRAW ve GL_STREAM_DRAW arabellek kullanım bayrakları vardır.

Yukarıdaki sorulardan herhangi birine cevabınız "evet" ise, neden VBO'lara göre avantajları olabilecek diğer render tarzlarını reddetmelisiniz?

Çünkü hiçbir avantajı yok. Her durumda geometri verilerinin GPU'ya aktarılması gerekir. Düzenli bir istemci tarafı köşe dizisi kullanmak yine de DMA’nın GPU’ya aktarılmasına neden olur ve anında mod ilk önce de aktarılacak bir toplu iş oluşturur.

VBO kullanmamanın kesinlikle bir faydası yok.


Yani performansım genellikle VBO'larda verteks dizilerinden daha kötü olmamalı, ancak modu doğru olarak GL_STREAM_DRAW olarak ayarladıysam?
Yerçekimi

@Gravity: Gerçekten de. Bununla birlikte, tampon modu yalnızca kullanımı beklenen bir ipucudur, ama elbette bu ipucu yapacağınız şey için doğru olmalıdır. Ayrıca arabellekleri güncellemeler için işlem adres alanınıza eşleyebileceğinizi unutmayın (glMapBuffer, glUnmapBuffer).
datenwolf

ama o zaman tampon VRAM'da olamazdı, değil mi? Yoksa hala VRAM'da mı olacaktı, ancak sadece işlem alanı adresleri üzerinden adreslenebilir mi? Rasgele erişim bu teknikle ucuz mu olacak yoksa yine de az sayıda bitişik aralığı güncellemeye çalışmalı mıyım?
Yerçekimi

@Gravity: Bir tampon sadece okunabilir, sadece yazılabilir veya okunabilir yazılabilir. Güncellemeler için sadece yazmayı seçersiniz. Şimdi modern işletim sisteminin sanal adres alanını, yani disk belleği bellek yoluyla nasıl yönettiğini bilmek önem kazanıyor. Yalnızca bir harita yazılması durumunda, bir DMA aktarım hafızasının bir parçasıyla eşleştirilirsiniz ve bu haritalanan aralığa yazdığınız yazılar doğrudan veya daha az GPU hafızasına gider (içerikler önce CPU RAM'e yazılır, ancak daha sonra DMA tarafından GPU'ya aktarılır) Aktar). Bunun, verinin bir istemci tarafı vertex dizisinden geçmesine nazaran daha doğrudan bir yol olması önemlidir: Düzenli işlem belleği DMA için uygun değildir
datenwolf 01
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.