Gl_quads kullanmanın hala avantajları var mı?


10

Tamam, gl_quad'lerin kullanımdan kaldırıldığını anlıyorum ve bu yüzden onları artık kullanmamız gerekmiyor. Ayrıca gl_quads kullanarak bir oyun çalıştırırken modern bir PC'nin aslında iki üçgen çizdiğini anlıyorum.

Şimdi bir oyunun bunun yerine üçgenler kullanılarak yazılması gerektiğini duydum. Ama merak ediyorum, OpenGL'nin bu dörtlüyü iki üçgene nasıl dönüştürdüğünün özellikleri nedeniyle, hala dörtlü kullanmanın avantajlı olup olmadığını merak ediyorum?

Özellikle, şu anda oldukça büyük tampon nesnelerden birçok bağlı dörtlü oluşturuyorum. Dikkat etmem gereken alanlardan biri, bu arabellek nesnelerini elde etmek / güncellemek için kullandığım şamandıraların vektörünün ne kadar büyük olduğudur (köşe başına oldukça fazla kayan şamandıra değerine ve bir tamponda çok fazla köşeye sahibim - en büyük arabellekler yaklaşık 500 KB'dir).

Bu yüzden, üçgenler çizmek için tampon nesnelerimi değiştirirsem bu tepe verisinin% 50 daha büyük olacağı (4 yerine kare çizmek için altı köşe) olacağı ve CPU'nun üretmesi için% 50 daha uzun süreceği dikkat çekiyor.

Gl_quads hala çalışıyorsa, burada bir avantaj elde ediyor muyum, yoksa OpenGL'nin iki üçgene otomatik dönüşümünde hala% 50 ekstra bellek ve CPU zamanı kullanılıyor mu?


5
Eminim OpenGL bir çeşit indeksli arabellek türünü destekler, yani bir dörtlü için sadece aynı 4 köşeyi saklarsınız ve iki üçgeni yapmak için tüm köşeleri tekrarlamak yerine, sadece endeksleri tekrarlarsınız: [0,1,2] , [2,3,0]

Harika cevap burada
bobobobo

GL spec hala dört gibi çizim bazı durumlarda şart koşuyor inanıyorum, örneğin glPolygonMode (..., GL_LINE).
Maximus Minimus

Yanıtlar:


5

Gerçek oyununuzu test edin. Dörtlü daha hızlıysa bunları kullanın. Değilse, yapma.

Bazı donanımlar dörtlüleri desteklemediğinden, bazı durumlarda daha yavaş olmalarına neden olabilir, bu nedenle sürücü dörtlü çağrıları "düzeltmek" için çok fazla iş yapmak zorundadır. Bazı donanımlar, bazı sabit işlevli giriş montaj adımında üçgenlere bölme yaparak dörtleri destekler, böylece önemli bir ek yük olmadan çalışır. Ayrıca, quad'lerin indeksli ve indekslenmemiş olarak nasıl gönderildiklerine ilişkin sorular da vardır ve bu da sınırlı veri yolu aktarım bant genişliği ve CPU oluşturma süresini daha iyi kullanır. Halk bilgeliği dörtlülerden kaçındığını söylüyor, bu da hiçbir şeyden başlıyorsanız iyi bir tavsiye, belki de kodunuz zaten çalışıyorsa çok fazla değil. halk bilgeliği, bu şeyleri yapan gerçek, iyi performans gösteren oyunlara rağmen birçok şeyin performansı öldürdüğünü söylüyor.

Kısacası, test edin. Varsaymayın ve İnternet'ten performans tavsiyesi istemeyin. Bazen haklı olabiliriz, ancak daha sık olarak ya güncel olmayan verileri, içinde bulunmadığınız belirli durumlara dayanan verileri ya da kendimizi internetten ya da iş arkadaşlarımızdan ikinci elden aldığımız açık çöpleri besleriz. ilk elden deneyime sahip).


3

Alternatifleri nelerdir? Bir alternatif, bir ilkel (4 köşe) geçen ve GS'nin bu ilkeli bir üçgen şeride dönüştürmesini sağlayan Geometri Gölgelendiricileri kullanmaktır GL_LINES_ADJACENCY. Bununla birlikte, bu işlemin daha yavaş olacağı için, geometri gölgelendiricilerin her zaman daha yavaş işlemesi gerektiğini varsaymalıyız .

Daha iyi bir yöntem dizin oluşturulmuş oluşturma kullanmaktır. Burada iki alternatifiniz var: GL_TRIANGLESve GL_TRIANGLE_STRIPilkel yeniden başlatma ile. İkincisi, biraz daha kısa bir dizin arabelleği (her dörtlü için bir dizin) ile sonuçlanacaktır. Herhangi bir dörtlü oluşturma için aynı dizin arabelleğini yeniden kullanabilirsiniz, böylece dizin arabelleğini güncellemeniz veya değiştirmeniz gerekmez.

Ayrıca dizin türü olarak imzasız şort kullanmanızı öneririz. Bir kerede 16384'ten fazla dörtlü işlemeniz gerekiyorsa, endeksleri dengelemek için glDrawElementsBaseVertex kullanarak birden çok oluşturma çağrısı yapın .


Yaptığım bazı yeni karşılaştırmalar glMultiDrawArrays'in artık hem NV hem de AMD'de (Intel ile uğraşmadı) hızlı bir yol olduğunu gösteriyor, bu yüzden başka bir seçenek var - fan veya şeritli glMultiDrawArrays.
Maximus Minimus

@ mh01: Bu, istemci tarafında bir çizim komutları dizisi gerektirir. Bunu glMultiDrawArraysIndirectGPU tarafında yapmanız gerekir. Bunu yapabilirsiniz, ancak donanımı sınırlar.
Nicol Bolas
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.