Fuori dai limiti nei giochi AAA


21

In molti titoli AAA comuni (in particolare i giochi del motore di origine), quando il giocatore raggiunge un'area "non approvata" per, ad esempio fuori limite, o facendo un salto sotto la mappa; si verifica uno strano effetto sullo schermo (lacerazione del buffer?).

Può essere descritto come simile alla scia di finestre che Windows XP può lasciare dietro una finestra trascinata mentre c'è un sistema bloccato.

Posso solo postulare che gli sviluppatori non cancellano il buffer di colore durante l'aggiornamento dello schermo?

È corretto? Se è così, perché?


8
A proposito, questo è spesso chiamato effetto "Hall of Mirrors" o HOM.
Nathan Reed,

Risposte:


35

C'era una volta, cancellare i buffer di colore e profondità in realtà richiedeva tempo. Fare un clear significava che la scheda grafica avrebbe dovuto percorrere ogni pixel del framebuffer e scriverne un valore.

Per questo motivo, gli sviluppatori di giochi hanno scoperto che sarebbe stato più efficiente supporre semplicemente che ogni pixel venisse nuovamente sottoposto a rendering. Hanno sviluppato molte tecniche per farlo.

Il buffer di colore è il più semplice da ignorare. Meno semplice è il buffer di profondità, perché verrebbe inquinato con vecchi dati. Quindi quello che hanno fatto è stato semplice.

Sul fotogramma 0, verrebbero visualizzati con un glDepthRange(o l'equivalente D3D) di (0, 0,5) e utilizzerebbero un glDepthFuncdi GL_LESS(o GL_LEQUAL). Ciò significa che il valore di profondità più lontano che avresti mai ottenuto nel buffer di profondità è 0,5. Quindi il valore più grande nel buffer di profondità alla fine del fotogramma 0 è 0,5 (supponendo che tu abbia scritto su ogni pixel).

Nel fotogramma 1, modificano l'intervallo di profondità in (1, 0,5). Si noti che in questo caso, il valore della profondità vicina è maggiore della profondità lontana. Ma cambieranno anche la funzione di profondità in GL_GREATER(o GL_GEQUAL), che inverte il significato del test di profondità. Poiché il valore più grande nel buffer di profondità è 0,5, tutto ciò che scrivi avrà un valore maggiore di questo. Poiché il test di profondità è stato invertito, ciò significa effettivamente che qualsiasi cosa sia stata scritta sul fotogramma 0 è ora più lontana di qualsiasi cosa possa essere scritta sul fotogramma 1. Alla fine del fotogramma 1, il valore più piccolo nel buffer di profondità è ora 0,5.

E poi ripetono.

Su qualsiasi hardware realizzato intorno al 2003, questa non è più un'ottimizzazione. In effetti, si tratta di un'ottimizzazione negativa . La cancellazione del buffer di profondità rende l'hardware più veloce . No davvero.

Fondamentalmente, ciò che accade è che i buffer di cancellazione in realtà non scrivono nulla. Memorizzano alcuni bit nelle cache della GPU che consentono al sistema di sapere a che colore / profondità sono stati cancellati. Quando il sistema tenta di scrivere su una riga della cache del framebuffer, non si preoccupa di leggere cosa c'è lì, perché sa già che si tratta di un campo vuoto con il chiaro valore di colore / profondità. Se provi a fonderti con quello che c'è o fai un test di profondità, di nuovo, non c'è bisogno di leggere: sa con quale valore fondere / testare / contro.

Quindi ogni prima lettura / modifica / scrittura che fai su ogni riga della cache dopo una cancellazione è sostanzialmente una scrittura. E ' gratuito .

Inoltre, avere un buffer di profondità frastagliato può funzionare su Hyper-Z / Hierarchial-Z / qualsiasi ottimizzazione dell'abbattimento Z nell'hardware. Sì, la tua scena funzionerà contro quelle alla fine man mano che aggiungi dettagli. Ma se il buffer di profondità è frastagliato da rendering precedenti, anche se quegli oggetti di sfondo sono in background, può influire sull'efficienza delle tecniche di abbattimento Z. E questo non aiuterà le prestazioni.

Quindi non dovresti mai fare questa tecnica di inversione di profondità nei giochi moderni.

Nota: Jari fa un buon punto sulle architetture di rendering basate su tile (come si trova nella maggior parte delle piattaforme mobili). Non cancellare la profondità può rendere le cose spiacevoli anche lì.


La tua ultima affermazione implica che non si alternerà mai il buffer di profondità o? Bella risposta.
Deceleratedcaviar

1
@Daniel Sì. Ho chiarito il mio post.
Nicol Bolas,

3
Inoltre, ignorare le architetture binning (come la maggior parte dei chip OpenGL ES) causa una perdita di prestazioni enorme , poiché il chip grafico non può fare ipotesi sullo stato del buffer di colore.
Jari Komppa,

5

Sì, hai ragione sul fatto che il back buffer non viene cancellato.

Perché (principalmente) è più veloce usare uno shader personalizzato che ping-pong valori di profondità in direzioni opposte ogni fotogramma e si basa sul fatto che il tuo gioco esegue sempre il rendering di ogni pixel sullo schermo.

Quindi a costo zero risparmi un buffer di cancellazione per frame.


1
Non conosco il ping-pong di profondità; ogni motore con cui ho familiarità cancella il buffer di profondità / stencil per ogni fotogramma. Ma a parte questo, sì, se il gioco visualizza tutti i pixel (come dovrebbe), non è necessario cancellare il buffer di colore.
Nathan Reed,

Potresti dare un esempio per lo shader, una buona risposta altrimenti.
deceleratedcaviar

1
Mi rendo conto che stai chiedendo dei motori recenti, leggendo il commento di @ NathanReed è quanti motori solo per PC funzionano ora. Il twist del buffer Z è una tecnica più vecchia, vedrò se riesco a trovare un riferimento. I motori della console elimineranno principalmente anche tutto il buffer di colore, anche un pixel che mostra l'effetto HOM che Nathan nominerà fallirà un titolo e lo costringerà a passare di nuovo le presentazioni.
Patrick Hughes,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.