Etkileri değiştirmenin pratik maliyeti


16

Projelerim için XNA kullanıyorum ve bu forumlarda bazen bir ağ için bir efektin değiştirilmesinin nispeten yüksek bir maliyete sahip olduğu gerçeğine referanslar görüyorum, bu bir etkiyi değiştirmeyi düşündüğüm için beni şaşırtıyor. uygun parametrelerle birlikte GPU'ya.

Birisinin bu süreçle ilgili maliyetinin tam olarak ne olduğunu açıklayabileceğini merak ettim. Ve eğer mümkünse, 'göreceli' bağlamı içine koymak?

Örneğin, toplamaya yardımcı olması için kısa bir gölgelendirici kullanmak istediğimi varsayalım:

  1. Her nesne üzerindeki efekti değiştirin, tanımlamak için benzersiz bir renk hesaplayın ve gölgelendiriciye sağlayın.
  2. Tüm nesneleri bellekteki bir oluşturma hedefine çizin.
  3. Hedeften renk alın ve seçilen nesneyi aramak için kullanın.

Bu işlemi tamamlamak için harcanan toplam sürenin hangi kısmı gölgelendiricileri değiştirmek için harcanır? İçgüdülerim, gölgelendiricinin ne kadar basit olursa olsun, sahneyi yeniden oluşturmanın, sürecin diğer bölümlerinden daha yavaş bir büyüklük sırası olacağını söyleyecekti, neden efektler üzerindeki tüm endişe?

Yanıtlar:


21

Tanımladığınız sorun "özel" bir sorun değil. GPU üzerindeki etkileri değiştirmek konusunda özellikle yavaş bir şey yoktur. Değişen efektler, efekt parametreleri (dönüşümler dahil), dokular, çeşitli oluşturma durumları ve basitçe çoklu çizim komutları gönderme sorunu , GPU'ya başka bir partinin gönderilmesini gerektirmesidir .

Partiler CPU ile sınırlıdır ve kullanmak için çerçeve başına yalnızca birkaç bin * alırsınız .

İşlemciye ve yaptığınız diğer işlere bağlıdır, ancak diyelim ki çerçeve başına yaklaşık 1000 parti elde edersiniz. Her toplu iş için bir nesne oluşturuyorsanız, sorunlara çarpmadan önce ekranda yaklaşık 1000 nesne çizebilirsiniz.

Birdenbire toplama eklerseniz ve tüm nesnelerinizi iki kez oluşturmanız gerekiyorsa, yalnızca 500 nesne çizmekle sınırlı kalırsınız.

(Yani az sayıda nesneniz varsa, endişelenmeyin!)

Kullandığınız seri sayısını azaltmak için temelde "akıllı" olmanız gerekir. Bunu yapmanın prototip yöntemi, birden fazla nesneyi akıllıca tek bir toplu iş olarak birleştirmektir. Özellikle " örnekleme " konusuna bakın . Belki de gölgelendiricinizdeki her nesneye benzersiz bir renk atamak için örnek numarasını kullanabilirsiniz.

Özellikle toplama için uygun olan başka bir teknik, oluşturulan nesneleri yazılımda kesmektir , böylece seçtiğiniz piksele dokunmadığını bildiğiniz hiçbir şeyi oluşturmazsınız.

İşte NVidia'dan "Toplu İş, Toplu İş, Toplu İş: Gerçekten Ne Anlama Geliyor?" (PDF) güzel grafikler ve bunu açıklayan şeyler. Ayrıca, parti sayınızı azaltmak için bazı teknikler de listelenir.


Kabul! Açıkladığınız için teşekkürler ve öneriler, okuduğum şeyler şimdi çok daha mantıklı. NVidia sunumu için de teşekkürler, sadece şimdi okuyorum ve çok yararlı.
sebf

1
"Parti, Parti, Parti" kağıdına güncellenen bağlantı: ce.u-sys.org/Veranstaltungen/…
Marton

1
Teşekkürler Marton, yazıya yeni bağlantıyı düzenledim :)
Andrew Russell
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.