Bir zamanlar,> <'den daha hızlı olduğunda ... Bekle, ne?


280

Harika bir OpenGL öğretici okuyorum . Gerçekten harika, güven bana. Şu anda bulunduğum konu Z-buffer. Tüm bunların ne olduğunu açıklamanın yanı sıra yazar, GL_LESS, GL_ALWAYS vb. Gibi özel derinlik testleri yapabileceğimizden bahsediyor. Ayrıca derinlik değerlerinin (üstte olan ve olmayan) gerçek anlamının da olabileceğini açıklıyor. özelleştirilmiş. Şimdiye kadar anlıyorum. Ve sonra yazar inanılmaz bir şey söylüyor:

ZNear aralığı zFar aralığından daha büyük olabilir; öyleyse, pencere alanı değerleri, görüntüleyiciye en yakın veya en uzak olanı tersine çevirir.

Daha önce, 0 pencere boşluğu Z değerinin en yakın ve 1'in en uzak olduğu söylendi. Ancak, klip-boşluk Z değerlerimiz reddedilirse, 1 derinliği görünüme en yakın ve 0 derinliği en uzak olur. Yine de, derinlik testinin yönünü (GL_LESS - GL_GREATER, vb.) Çevirirsek, aynı sonucu alırız. Bu gerçekten sadece bir kongre. Aslında, Z işaretini ve derinlik testini tersine çevirmek bir zamanlar birçok oyun için hayati bir performans optimizasyonuydu.

Doğru anlıyorsam, performans açısından, Z işaretini ve derinlik testini ters çevirmek, <karşılaştırmayı karşılaştırmaktan başka bir şey değildir >. Yani, eğer doğru anlamak ve yazar sonra değişen, yalan veya uyduruyor değilse <etmek >olmaya kullanılan hayati optimizasyon birçok oyunlar için.

Yazar, uyduruyor şey yanlış anlama ediyorum, yoksa bir zamanlar durum gerçekten de <(yavaştı hayati daha yazarının da belirttiği üzere) >?

Bu oldukça ilginç meseleyi açıkladığınız için teşekkürler!

Feragatname: Algoritma karmaşıklığının optimizasyonlar için birincil kaynak olduğunun tamamen farkındayım. Dahası, bugünlerde bunun kesinlikle bir fark yaratmayacağından şüpheleniyorum ve bundan herhangi bir şeyi optimize etmesini istemiyorum. Sadece aşırı derecede acı verici, belki de merakla merak ediyorum.


6
Bu öğreticiye bağlantı (son zamanlarda) ölmüş görünüyor. :(
TZHX

@TZHX: Kabul edilen cevap öğreticinin yazarı tarafından yazıldığından, tekrar bulmayı umuyoruz.
Cevabına

3
Başvurulan OpenGL öğreticisine buradan ulaşabilirsiniz .
Fons

(a <b), (b> a) ile aynıdır, bu nedenle donanımdaki her iki karşılaştırma işlemini kesinlikle uygulamaya gerek yoktur. Performanstaki fark, karşılaştırma işleminin sonucunda olanların sonucudur. Bu, tüm yan etkileri açıklamak için uzun ve dolambaçlı bir yol ama burada birkaç işaret var. Oyunlar, derinlik testini geçemeyen parçalar için daha pahalı parça işlemeyi önlemek için derinlik tamponunu doldurmak için kullanılır. Quake, çerçeve ara belleğini temizlememek için derinlik aralığını iki yarıya bölmek için kullanılır, çünkü oyun her zaman ekrandaki her pikseli doldurur vb.
t0rakka

2
@Fons yine bağlantı ölü gibi görünüyor :(
nalzok

Yanıtlar:


350

Doğru anlıyorsam, performans açısından, Z işaretini ve derinlik testini ters çevirmek <karşılaştırmayı> karşılaştırmasıyla değiştirmekten başka bir şey değildir. Yani, doğru anlarsam ve yazar yalan söylemiyorsa veya bir şey uydurmuyorsa, <oyun> 'a geçmek birçok oyun için hayati bir optimizasyondu.

Bunu çok iyi açıklamamıştım, çünkü önemli değildi. Sadece eklemek için ilginç bir trivia olduğunu hissettim. Özellikle algoritmayı gözden geçirmek istemedim.

Ancak, bağlam anahtardır. Asla <karşılaştırmanın bir karşılaştırmadan daha hızlı olduğunu söylemedim. Unutmayın: CPU'nuzdan değil grafik donanım derinlik testlerinden bahsediyoruz. Hayır operator<.

Bahsettiğim GL_LESS, [0, 0,5] aralığında bir kare kullanacağınız belirli bir eski optimizasyondu . Sonraki kare, GL_GREATER[1,0, 0,5] aralığıyla oluşturursunuz. Her kareye tam anlamıyla "Z işaretini ve derinlik testini ters çevirerek" ileri geri gidersiniz.

Bu, bir derinlik hassasiyetini kaybeder, ancak bir zamanlar oldukça yavaş bir işlem olan derinlik tamponunu temizlemeniz gerekmez. Derinlik temizliği sadece bugünlerde ücretsiz değil, aslında bu teknikten daha hızlı olduğu için, insanlar artık bunu yapmıyor.


1
Derinlik arabelleğinin temizlenmesinin bu günlerde daha hızlı olmasının iki nedeni vardır, her ikisi de GPU'nun hiyerarşik bir derinlik tamponu kullanmasına dayanmaktadır. Bu nedenle, karo durumlarını yalnızca (hızlı olan) temizleyecek şekilde ayarlamanız gerekir, ancak derinlik karşılaştırma işaretini değiştirmek, karşılaştırma işaretine bağlı olarak yalnızca bir min veya maksimum değer depolaması nedeniyle tüm HiZ arabelleğinin yıkanması gerektiği anlamına gelir.
Jasper Bekkers

3
@NicolBolas: PerTZHX'in yorumu, sorumdaki öğreticinin bağlantısı öldü. Lütfen eğiticilerin nereye taşındığını ve isteğe bağlı olarak soruyu düzenlediğini bize bildirir misiniz, lütfen?
Armen Tsirunyan

2
Eğitimler web arşivinde bulunmaktadır. @NicolBolas izin verirse, onları daha erişilebilir bir yere taşıyabilirsek topluluk için yararlı olacaktır. Belki GitHub falan. web.archive.org/web/20150215073105/http://arcsynthesis.org/…
ApoorvaJ

3

Cevap neredeyse kesinlikle çip + sürücünün enkarnasyonu için kullanılan Hiyerarşik Z'nin sadece bir yönde çalıştığıydı - bu gün içinde oldukça yaygın bir konuydu. Düşük seviyeli montaj / dallamanın bununla hiçbir ilgisi yoktur - Z tamponlama sabit işlevli donanımda yapılır ve boru hattına bağlanır - spekülasyon ve dolayısıyla dal tahmini yoktur.


0

Bunun gibi optimizasyon, birçok yerleşik grafik çözümünün performansına zarar verir, çünkü framebuffer çözümünü daha az verimli hale getirir. Bir tamponun temizlenmesi sürücüye binning sırasında tamponun depolanması ve geri yüklenmesi gerekmediğine dair açık bir sinyaldir.

Küçük arka plan bilgileri: bir döşeme / binster rasterizörü, ekranı çip üzerindeki belleğe uyan çok küçük karolar halinde işler. Bu, bellek veri yolundaki trafiği azaltan harici belleğe yazma ve okuma sayısını azaltır. Bir çerçeve tamamlandığında (takas çağrıldığında veya dolu olduklarından FIFO'lar temizlenir, çerçeve arabellekleri değişir, vb.) Çerçeve arabellek çözülmelidir; Bu, her bölmenin sırayla işlendiği anlamına gelir.

Sürücü, önceki içeriğin korunması gerektiğini varsaymalıdır. Koruma, kutunun harici belleğe yazılması ve daha sonra kutu tekrar işlendiğinde harici bellekten geri yüklenmesi gerektiği anlamına gelir. Silme işlemi, sürücüye bölmenin içeriğinin iyi tanımlandığını söyler: açık renk. Bu, optimize edilmesi önemsiz bir durumdur. Ayrıca arabellek içeriğini "atmak" için uzantılar vardır.


-8

Yüksek ayarlanmış montajda bayrak bitleri ile ilgilidir.

x86'nın hem jl hem de jg talimatları vardır, ancak çoğu RISC işlemcisinde yalnızca jl ve jz (jg yok) bulunur.


2
Cevap buysa, yeni sorular ortaya çıkar. Erken alınan RISC işlemcilerinde "şube alındı", "şube yoksayıldı" dan yavaş mı? Kesinlikle bildiğim kadarıyla ölçülebilir bir şekilde bu şekilde değil. forKoşulsuz bir dalı geriye doğru olan döngüler ve döngüden çıkmak için nadiren koşullu, ileriye dönük bir dal yazmanız gerekiyor muydu? Kulağa garip geliyor.
Pascal Cuoq

54
-1: Bu sorunun CPU'larla hiçbir ilgisi yok . GL_LESS ve GL_GREATER, GPU'larda çalışan derinlik karşılaştırma işlemleridir.
Nicol Bolas

8
Komik başlık için doğru ama gerçek soru ile çok az bir cevap için ne kadar temsilcisi alabilirsiniz.
Joshua

7
+1 Hayır, bu cevap sorunun en azından bir kısmı için doğrudur. Soru şudur: "Yazar bir şeyler uyduruyor mu, bir şeyleri yanlış mı anlıyorum, yoksa gerçekten de <bir kez daha <yazarın söylediği gibi> daha yavaş olduğu gibi mi?". Üç seçenek verilmiştir. Bu yanıt seçenek 3'ün olasılığı üzerine yanıt veriyor. Makalenin hiçbir yerinde verilen CPU / GPU teknolojisi ya da bir GPU (CPU'da ilk 3D oyunlar) olması gerekmiyor. Tamam ...
RISC'de

3
(ve GPU etiketi 20:34 saatinde eklendi. İlk revizyonda yalnızca CPU etiketi vardı. Bu yanıt 18:44 olarak yazılmıştır)
xanatos
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.