AAA oyunlarında sınırların dışında


21

Yaygın olarak kullanılan birçok AAA başlığında (özellikle Kaynak motoru oyunları), oyuncu sınırlar dışında veya haritanın altında kaymayacak şekilde 'ikram edilmemiş' bir alana ulaştığında; Ekranda garip bir etki (arabellek yırtılması?).

Windows XP'nin bir sistemin kilitlenmesi sırasında sürüklenmekte olan bir pencerenin arkasında bırakabileceği pencerelerin izine benzer olarak tanımlanabilir.

Ekranı yenilerken yalnızca geliştiricilerin renk arabelleğini temizlemediğini varsayabilir miyim?

Bu doğru mu? Öyleyse neden?


8
BTW, bu genellikle "Aynalar Salonu" etkisi veya HOM olarak adlandırılır.
Nathan Reed

Yanıtlar:


35

Bir zamanlar, renk ve derinlik tamponlarını temizlemek gerçekten zaman aldı. Net yapmak, grafik kartının çerçevenin her pikselini gezmesi ve buna değer yazması gerektiği anlamına geliyordu.

Bu nedenle oyun geliştiricileri, her pikselin tekrar işleneceğini varsaymanın daha verimli olacağını keşfetti. Bunu yapmak için birçok teknik geliştirdiler.

Renk arabelleği yoksaymak en kolay olanıdır. Derinlik tamponu daha az kolaydır, çünkü eski verilerle kirlenecektir. Yani yaptıkları basitti.

Çerçeve 0., bir ile render glDepthRange(0, 0.5) arasında (veya D3D eşdeğer), ve bir kullanmak glDepthFuncarasında GL_LESS(ya da GL_LEQUAL). Bu, derinlik tamponunda elde edebileceğiniz en uzak derinlik değerinin 0,5 olduğu anlamına gelir. Dolayısıyla, 0 karesinin sonundaki derinlik arabelleğindeki en büyük değer 0,5'tir (her piksele yazdığınız varsayılmaktadır).

Çerçeve 1'de derinlik aralığını (1, 0.5) değiştirirdi. Bu durumda, yakın derinlik değerinin uzak derinlikten daha büyük olduğuna dikkat edin . Fakat aynı zamanda derinlik fonksiyonunu GL_GREATER(veya GL_GEQUAL) değiştirir, bu da derinlik testinin anlamını tersine çevirir. Derinlik arabelleğindeki en büyük değer 0,5 olduğundan, yazdığınız her şey bundan daha büyük bir değere sahip olacaktır . Derinlik testi tersine bu yana, bu etkili bir çerçeve 0 yazılmıştır ne olursa olsun uzağa muhtemelen çerçeve 1 'in sonunda çerçeve 1 üzerine yazılabilir şeyden artık anlamına gelir küçük derinlik tamponunda değeri artık 0.5'tir.

Ve sonra tekrarlar.

2003 yılından bu yana yapılan herhangi bir donanımda, bu artık bir optimizasyon değil. Gerçekten de, olumsuz bir optimizasyon . Derinlik tamponunu temizlemek aslında donanımı daha hızlı yapar . Hayır, gerçekten.

Temel olarak, olan şey, tamponların silinmesinin aslında hiçbir şey yazmadığıdır. GPU'nun önbelleklerinde, sisteme hangi renk / derinliğe temizlendiklerini bildiren bazı bitler depolar. Sistem çerçeveleyicinin önbellek satırına yazmaya çalıştığında, orada olanı okumak zahmete girmez, çünkü zaten net renk / derinlik değerinin boş bir alanı olduğunu bilir. Var olanla karıştırmaya çalışırsanız veya derinlik testi yaptırırsanız, tekrar okumaya gerek yok: hangi değerle karıştırıp / karşılaştırılacağını bilir.

Bu nedenle, bir temizlemeden sonra her önbellek satırında yaptığınız her okuma / değiştirme / yazma temel olarak bir yazıdır. Bu var ücretsiz .

Ayrıca, pürüzlü bir derinlik tamponuna sahip olmak, donanımdaki Hyper-Z / Hierarchial-Z / Z-culling optimizasyonlarına karşı çalışabilir. Evet, sahneyi ayrıntı eklerken en sonunda bunlara karşı çalışır. Ancak, derinlik tamponunuz önceki görüntülemelerden tırtıklıysa, bu arka plan nesneleri arka planda olsa bile, Z-ayırma tekniklerinin verimliliğini etkileyebilir. Ve bu performansa yardımcı olmayacak.

Bu yüzden modern oyunlarda bu derinlik ters tekniğini asla yapmamalısınız .

Not: Jari, karo tabanlı işleme mimarilerinde (çoğu mobil platformda olduğu gibi) iyi bir noktaya değinmektedir. Derinliği temizlememek orada da rahatsız edici şeyler yapabilir.


Son ifaden derinlik tamponunu asla değişmeyecek şekilde mi gösteriyor? Mükemmel cevap.
yavaşladı

1
@Daniel Evet. Görevimi açıklığa kavuşturdum.
Nicol Bolas

3
Ayrıca, bindirme mimarisindeki netliği atlamak (çoğu OpenGL ES yongaları gibi), grafik yongası renk arabelleği durumuna ilişkin varsayımlarda bulunamadığından büyük performans kaybına neden olur .
Jari Komppa

5

Evet, arka tamponun temizlenmemesi konusunda haklısın.

Bunun nedeni (çoğunlukla), derinlik değerlerini her kareye zıt yönlerde ping ponglayan özel bir gölgelendirici kullanmanın daha hızlı olmasından ve oyununuzun her zaman ekranda her pikseli oluşturmasına dayanıyor olmasıdır.

Böylece sıfır maliyet için çerçeve başına bir tamponu temizlersiniz.


1
Derin ping ponging hakkında bilmiyorum; Tanıdığım her motor her çerçevenin derinlik / şablon tamponunu temizliyor. Fakat bunun dışında, evet, eğer oyun tüm pikselleri oluşturursa (olması gerektiği gibi), renk tamponunu temizlemeniz gerekmez.
Nathan Reed

Gölgelendiriciye bir örnek verebilir misiniz, aksi takdirde iyi bir cevap.
dececaratedcaviar

1
Son motorları sorduğunuzu anlıyorum, @ NathanReed'in yorumunu okumak sadece kaç tane PC'nin çalıştığını gösteriyor. Z tampon büküm eski bir tekniktir, bakalım bir referans bulabilecek miyim. Konsol motorları çoğunlukla tüm renk tamponunu da temizler, Nathan'ın adlandırdığı HOM etkisini gösteren bir piksel bile bir başlığın başarısız olmasına ve tekrar tekrar gönderilmeye zorlar.
Patrick Hughes
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.