Her şey için örnekleme mi kullanıyorsunuz?


16

Eşzamanlama, aynı mesh'in birden çok kopyasını aynı anda oluştururken performansı (önemli ölçüde) artırır. Ancak bir çizim çağrısıyla tam olarak bir kopya oluştururken ne kadar ek yükü var? Motor tarafından oluşturulan tüm geometri için örnekleme kullanmak iyi mi yoksa kötü bir fikir mi?

Edit: Diyelim ki bir FPS oyunu oluşturuyoruz. Nesnelerin çoğunun sadece bir örneği vardır: bir bıçak, bir tabanca, bir makineli tüfek, bir bina ve bir radyo kulesi. Ama aynı zamanda birden çok örneği olan bazı nesneler de vardır: ağaçlar (örneğin yüzlerce örneği olan 3 çeşit ağaç), çimen vb. ve otları örnekleme kullanarak , hepsini örnekleme kullanarak yaparız . Bu nedenle radyo kulemizin yalnızca bir örneği var (bilgilerini bir örnek veri arabelleğinde sakladığımız) ve bu kuleyi DrawInstanced()örnek sayısı ile bir tür çağrı kullanarak eşitliyoruz 1. Diğer tüm nesnelerle aynı (elbette, ağaçların ve otların birden fazla örneği vardır).

Benim sorum şu: örnekleme kullanarak bir nesnenin tek bir örneğini çizmek kötü bir fikir mi? Örnekleme işleminin çok fazla yükü var mı (bellek ve performans açısından) veya tek örnekli nesneler oluşturmak için herhangi bir şekilde istenmiyor mu?

Yanıtlar:


19

XPDM ile D3D9 altında neredeyse kesinlikle mümkün olan yerlerde örnek almak istersiniz. Beraberlik çağrı yükü o kadar yüksek ki mantıklı. Bu senaryoda, geçiş noktası 2 veya 3 örnek kadar düşük olabilir.

Belirli bir ağın yalnızca bir örneğine sahipseniz, yüzeyde anlık olmayan çizmek cazip gelebilir. Ancak, neyin dahil olduğuna bakın:

  • Verileri yüklemek için örnek başına arabelleğe, gölgelendirici sabitlerini yüklemeye geçmeniz gerekir.
  • Köşe gölgelendiricinizin iki kopyasını saklamanız gerekir: biri örneklenmiş, diğeri örneklenmemiş için.
  • Oluşturma kodunuzun iki kopyasını saklamanız gerekir: aynı şekilde.
  • Gölgelendiricileri değiştirmeniz gerekir.
  • Tepe biçimlerini değiştirmelisiniz.
  • Tepe arabelleklerini değiştirmeniz gerekebilir.
  • Ve bir sonraki kafes grubu için anlık çizime geri dönüyorsanız, her şeyi tekrarlamanız gerekir.

Sadece tek bir ağınız olsa bile (bir FPS'deki silah modeli gibi), örneklemenin yararlı olduğu durumlar vardır. Diyelim ki ileri bir oluşturucuda ve z ön geçişli çok geçişli ışık birikimi yapıyorsunuz. Her ışık için fazladan bir geçiş yerine, ışıklarınızı örnek başına veri yaparsınız ve anında çizersiniz.

İlk senaryoya dayanarak, hikayenin ahlakı, herhangi bir nesne sınıfı örneklemeyi hiç kullanabiliyorsa, o sınıfın tüm nesneleri için örneklemeyi her zaman kullanmanın mantıklı olmasıdır.

İkinci senaryoya dayanarak, hikayenin ahlakı, örneklemenin sadece "20 ağaç çizmem lazım" demenin ötesinde belirgin olmayan kullanımları olabileceğidir.


Verdiğiniz nedenler, bu soruyu ilk etapta sormama neden olanlarla aynı. Teşekkür ederim.
NPS

12

(Sistemimde, başka bir yerde test etmedim) GL'de, tek bir kafes (count = 1 ile çizim) başlatmanın bazı kötü yükleri var, ama nereden geldiğini bilmiyorum. Kesinlikle yapmamanızı öneririm.

Bunu birkaç ay önce pratik bir uygulamada test ettim. Crytek Sponza sahnesindeki kabaca 350 ya da daha fazla ağdan oluşan (tam olarak hatırlamıyorum) bir çiftin birkaç örneği paylaştığı bazı küresel aydınlatma algoritmalarını kodladım. Başlangıçta önerdiğiniz gibi yaptım, sadece her şeyi örnekleyin ve geri kalanını 1 örnek sayısı ile çizin, çünkü oluşturma kodunu biraz basitleştirdi.

Daha sonra oluşturucuyu optimize ederken, sadece sayım = 1 nesnelerini örneklemekten normal şekilde göndermeye geri dönerek, i7 3770k (ve GTX 770) üzerinde kare başına yaklaşık 3,5 milisaniye kazandım. Kafesleri çoklu örneklerle değiştirmek, sadece geleneksel şekilde yapmak için bana 0.5ms daha kazandırdı. Genel olarak uygulama ~ 120 FPS'den yaklaşık ~ 230 FPS'ye gitti.

Bu rakamlar elbette her zaman darboğazların uygulamanızda nerede bulunduğuna bağlıdır ve son 0.5ms, çağrı çekmeye bağlı olduğunuz bir uygulamada aslında yavaşlayabilir. Ama aksi takdirde, deneyimlerime göre, aynı anda çok fazla şey çizmiyorsanız, örneklemenin kötü bir yükü var.


İlginç, ancak AMD ve Intel sürücülerinin verilerini görmek güzel olurdu, aksi takdirde "In GL" yerine "Sistemimde" demelisiniz. Öte yandan, diğer uygulamalarla ilgili bir sorun olmasa bile, bazılarında olabileceği gerçeği, onu kullanmıyorsanız, örnek oluşturmayı önlemek için yeterli nedendir.
bcrist

2

Örneklendirilmiş tek bir nesne çizmenin, normalde tek bir nesne çizmekten daha pahalı olduğundan emin olabilirsiniz. Örnekleme için GPU çok sayıda nesneye hazırlanıyor ve bu hazırlık tek bir nesneden farklı olacaktır. Bununla birlikte, bu performans boşluğunun ne kadar büyük olduğunu yalnızca deneme yoluyla bulabilirsiniz ve gerçek oluşturma ayarınıza bağlı olarak çok fazladır. Kesin olarak bilmenin tek yolu kendiniz test etmektir. Tek bir çizim çağrısını karşılaştırmak zor, burada nasıl ilerleyebileceğinize dair birkaç fikir var.


2

Bu 4 yıl geçti ... ve sanırım onun size yeni API'ler fark etmiş olabileceğiniz gibi o "instanced" Gönder 1. Aramaları çizmek herhangi bir sorun oluşturmaz söylemek güvenli DX12 ve Vk 0'dan olabilir bir örnek sayımı var hem NUM_INSTANCES . Ayrıca DrawIndexed (...) olmadığını unutmayın .

DÜZENLE

Dikkat edilmesi gereken bir nokta olarak, yukarıda bu modern API'lerle ilgili sorun yoktur, belki Gl <3.3 veya belki DX11 gibi eski bir şey kullanmak, diğer kullanıcılar tarafından belirtildiği gibi bazı profilleme gerektirecektir.

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.