Optimization (Q4 engine games)
Tutorial di livello avanzato


Q4 games specific tutorials (quick links)

  Base | Intermedio | Avanzato
  Base | Intermedio | Avanzato
  Base | Intermedio | Avanzato



Visportals

0. Introduzione
1. I Visportals

2. Condizioni di funzionamento e limiti
3. Visportals: interazioni
4. Visportals e scissors
5. Strumenti di ispezione









WARNING Please, NON linkare direttamente immagini o altro. Se trovi qualcosa di utile e vorresti riproporlo nel tuo sito, ti prego di conttattarci usando il nostro Forum



















































































































































  Q4 specific Feature

In Quake 4 è stato implementato un tipo speciale di Visportal, la cui apertura/chiusura risponde alla distanza in cui si trova il player.





































































































































































 

Visportals (Q4 engine games)    
Come funzionano e come si costruiscono i Visportals    
nei giochi basati sul Q4 engine   by CARNUFEX    
      0. Introduzione
Questo è il primo di una serie di Tutorials su Ottimizzazione di livelli e mappe per Videogames che usano una delle versioni del motore Q4. I tutorials sono dunque utili per Doom 3, Quake 4 e PREY, con diferenze che saranno evidenziate di volta in volta.

In questo primo tutorial ci occupiamo della VIS (Visibility) e quindi del corretto uso dei Visportals, che sono quegli strumenti usati, appunto, per ottimizzare la VIS nei giochi basati sul Q4: vedremo in primo luogo come funzionano e come costruirli, poi discuteremo le condizioni di lavoro ottimali dei visportals, i loro limiti e le interazioni con altri elementi dei livelli. Infine ci occuperemo dell'uso di alcuni Cvars utili per la visualizzazione dei tris e dei portals. Il tutorials sono di livello avanzato, per cui si parte dall'assunto che conosci già le basi dell'editing e sai come usare uno degli editor per i giochi richiamati sopra.

Affiderò la prima parte della spiegazione a un'animazione. Siccome si tratta di una semplice GIF, che a questo punto dovrebe essere già partita, per vederla fin dall'inizio ti suggerisco di ricaricare la pagina. In ogni caso, ti segnalo qui accanto il primo frame, peraltro in una imagine un po' sgranata ma riconoscibile ;)
 
     1. I Visportals
 
     
     2. Condizioni di funzionamento e limiti
Ora che sai come funzionano i Visportals e sei in grado di costruirli correttamente, vediamo di approfondire un po'. Intanto va detto che l'animazione, per esigenze di brevità, semplifica un po' le cose, per cui sarà il caso di fare alcune puntualizzazioni per completare il quadro e mostrarlo in tutta la sua complessità. Lo faremo alla fine del tutorial, al momento di mostrare gli strumenti di ispezione dei livelli. Ora invece soffermiamoci su alcune questioni di primaria importanza: vediamo per prima cosa quali sono le condizioni di lavoro ottimali dei Visportals e i limiti di questa tecnica. Vediamo anche in che modo l'inserimento di visportals possa interagire con gli altri elementi del livello.


2.1 Condizioni di funzionamento

Come avrai potuto vedere, i Visportals sono strumenti di ottimizzazione indispensabili, senza i quali non potremmo ottenere né livelli Singleplayer né mappe Multiplayer giocabili in modo fluido e con buone performances. Tecnicamente, il lavoro compiuto dai Visportal è noto come overdraw reduction.

Ora, affinché i visportals facciano questo loro lavoro di riduzione della geometria processabile alle sole aree visibili, i nostri livelli devono essere fatti a regola d'arte o, almeno, devono essere privi di:

    - Leaks esterni;
    - Leaks interni.

Inutile soffermarsi sui Leaks esterni. Di solito si sta bene attenti a evitarli, e quando ci sono vengono segnalati in console e bloccano la compilazione; inoltre, per scovareli c'è il pointfile. Si fa invece meno attenzione a quelli interni, più subdoli e difficili da rintracciare e risanare. Ebbene, se non stai alla larga anche dai leaks interni, il lavoro di ottimizzazione perderà di efficacia.

Il Leaks interni sono contatti (diciamo fori) tra una stanza, area, settore e l'altro contiguo. Se la geometria di un settore è bucata, il visportal che divide le due aree, settori, stanze non funzionerà a dovere, perché gli ambienti comunicheranno attraverso il leak ignorando il visportal. Oltre a ciò, poiché per la delimitazione delle locations il motore usa i visportals, la presenza di leaks interni renderà impossibile la denominazione diversificata delle aree, perché il motore non riuscirà ad identificarne i confini.


2.1 Limiti di questa tecnica

Altre condizioni di lavoro ottimale dipendono dalla quantità e dal posizionamento dei Visportals. Per quanto riguarda la quantità, bisogna considerare il fatto che l'inserimento di visportals segmenta la geometria che viene intersecata, aumentando così il numero di poligoni. Questo è il limite più vistoso di questa tecnica; ma se i visportals non vengono usati in modo improprio, questo limite non avrà un'incidenza determinante nell'economia complessiva del livello. In altre parole, i visportals vanno usati con parsimonia, soprattutto in presenza di ambienti geometricamente complessi, fatti di un elevato numero di poligoni, e il loro posizionamento dev'essere estremamemte preciso, vale a dire che le loro dimensioni devono coincidere esattamente con le dimensioni dell'apertura che si intende otturare, sia sull'asse verticale che orizzontale.

Ma il fatto determinante quanto al pisozionamento resta la loro distribuzione e orientamento nel livello. Come si vede nell'animazione, la geometria solida non blocca la visibilità. Il ruolo di quest'ultima è semplicemente quello di limitare i movimenti del player e quindi le prospettive da cui uno o più visportals possono entrare nel cono di visibilità della camera/player. Poiché è importante limitare il più possibile la quantità di portals visibili attraverso un visportal, l'architettura del livello dovrebbe essere fatta in modo tale da guidare il player lungo un percorso che non presenti mai una successione di visportals disposti in linea retta.
 
     
     3. Visportals: interazioni
Vediamo come interagiscono i visportals con altri elementi del livello.


  3.1 Visportals e porte

I visportals vanno a nozze con le porte automatiche :)
Posizionato all'interno di una porta, il visportal si aprirà all'apertura della porta e si richiuderà automaticamente quando la porta viene richiusa. Il motore eseguirà il rendering della geometria visibile dopo l'apertura, e con essa il calcolo dell'incidenza della luce che passa da una stanza all'altra e colpisce le textures prima illuminate dalle sole luci presenti nel settore. Questo è uno dei migliori risultati a livello estetico, oltre che funzionale, di questa nuova tecnica e al tempo stesso la migliore dimostrazione di come la VIS lavori dinamicamente indipendentemente dalla BSP.


  3.2 Visportals e modelli

Il motore tratta i modelli come singole unità in base al box che li contiene e non poligono per poligono come invece avviene per la normale geometria. Questo significa che se un modello di grosse dimensioni (diciamo una caverna) viene intersecato da un visportal, la porzione del modello al di là del visportal verrà processata comunque, e con essa anche le luci e parte della geometria che lo circonda. In questi casi è inutile e controproducente usare i visportals.


  3.3 Visportals e luci

Come i modelli, così anche le luci vengono trattate dal motore in base al box esterno che ne delimita la portata, e non in base al centro. Questo significa che se anche un angolo del box è visibile attraverso un visportal l'entità verrà renderizzata. (Sull'ottimizzazione dell'illuminazione v. il tutorial dedicato [soon]).


  3.4 Visportals e textures riflettenti

Com'è noto, il Q4 è così "intelligente" da capire da solo che non deve prendere in considerazione i lati dei poligoni che si affacciano all'esterno del worldspan. Questo ci consente di fare a meno dal caulk su quelle superfici. Tuttavia ciò non vale per tutte le textures. Nel caso delle reflective textures, come l'acqua e gli specchi, se solo una piccola parte di esse è a contatto con il vuoto, il lavoro di ottimizzazione con i visportals non avrà effetto e l'intero livello verrà processato come una singola gande area.


  3.5 Visportals e func_portals

Il func_portal è un'entità che può essere applicata al brush texturato con (nodraw+)visportal e collegato a un trigger, al fine di ottenere un portal che si aprirà solo quando il player entrerà a contatto con il trigger. Un esempio del suo uso lo si trova nella stock map mc_underground, applicato all'airlock door.
 
     

     4. Visportals e scissors
Come anticipato in apertura, nella prima parte del tutorial abbiamo un po' semplificato per guadagnare in immediatezza. Ora è arrivato il momento di dirla tutta ;)
I visportals non lavorano da soli, ma in combinazione con le scissors.
Cosa sono, innanzitutto, le scissors? Nelle applicazioni OpenGL le scissors (forbici) sono rettangoli applicati a schermo che decidono quali pixels verranno scartati senza mai arrivare sullo schermo: qualcosa come uno stencil di forma rettangolare, che ha funzioni analoghe allo Zbuffer.

Il loro funzionamento è sostanzialmente il seguente: quando la camera/player inquadra un visportal, questo si apre in modo da permettere il rendering della scena contenuta all'interno del settore. Prima però di procedere al rendering, il motore applica una scissor intorno al visportal, creando una cornice che nasconde la visione di tutto ciò che non rientra nello specchio del visportal, al fine di evitare che i pixels fuori portata vengano attivati su schermo. Attenzione però: che l'area tagliata via dalle forbici non sia visibile su schermo non significa che non venga processata e renderizzata.

Infatti, questa tecnica ha un grosso limite. L'applicazione delle scissors non impedisce il rendering dell'area schermata dalla cornice: la CPU deve comunque processare i triangoli, raccoglierli in batches, caricare le textures e inviarle alla scheda grafica, la quale deve ancora effettuare il vertex shader e rasterizzare tutti i triangoli. Fatto questo, la scheda scarterà tutta l'area schermata, ottimizzando così il fill rate. E' dunque soltanto la sequenza terminale del processo di calcolo che viene alleggerita: per il resto, il sistema lavora a pieno ritmo.

Questa precisazione è molto importante al momento di usare gli strumenti di ispezione, come vedremo al punto seguente.
 
     
     5. Strumenti di ispezione
Per vedere cosa effettivamente sta combinando il motore grafico, possiamo servirci degli strumenti di ispezione, attivabili dalla console. Qui vedremo solo quelli utili a controllare la visibilità, che sono:

 r_showportals 1

(rende visibili i portals disegnandovi un rettangolo intorno, di colore rosso se sono chiusi e verde se sono aperti).


 r_showtris 1

(mostra i lati dei poligoni visibili dal player data la sua attuale posizione)

Questo Cvar NON è molto utile per l'ottimizzazione, dal momento che si limita a restituire esattamente la visione del player, che non coincide con quella del motore, come possiamo notare nelle immagini successive.
 

 r_showtris 2

(mostra i lati dei poligoni che il motore è in grado di "vedere", al di là della visione del player)


 r_showtris 3

(mostra i lati dei poligoni che il motore è in grado di "vedere" e, in aggiunta, anche le facce retrostanti, non visibili al player)

NB In questo caso la differenza non è percettibile perché tutte le facce nascoste sono state ricoperte con caulk. In ogni caso, è questo il Cvar da utilizzare nella ispezione della geometria visibile dei livelli

A questo punto, usando r_showtris 3 potremmo presumere che ciò che si vede su schermo sia la totalità della geometria che il motore invia alla CPU e questa a sua volta alla GPU.

E invece non è così. Gli screenshots di sopra sono stati ripresi con la scissor attivata e non rispecchiano la totalità della geometria processata dal nostro sistema. Si nota infatti chiaramente che la geometria intorno al portal (schermata dalla scissor) è stata scartata, cosa che vediamo con maggiore chiarezza nello screenshot di sotto a sinistra, dove muovendoci a sinistra abbiamo sovrapposto due visportals. Scartata, vale la pena ripeterlo, non significa che non sia stata processata. Infatti, se lo confrontiamo con lo screenshot di destra, in cui la scissor è stata disattivata inserendo il Cvar r_useScissor 0 in console, ci rendiamo conto che la maggior parte dei poligoni del secondo settore, anche se non possono essere visti dal player, sta ancora impegnando il nostro sistema.

va da sé in una piccola stanza spoglia ciò non ha la minima importanza, ma prova a pensare a un grande stanzone pieno di geometria, modelli, effetti e luci :P


Riassumendo, per testare la visibilità della geometria ai fini di ottimizzare le performance, la prima cosa da fare è disattivare la Scissor. In secondo luogo, visualizzare i portals e i tris, usando rispettivamente, i seguenti Cvars:

 r_useScissor 0
 r_showportals 1
 r_showtris 3


Con questi tre strumenti puoi girare in lungo e in largo il tuo livello a caccia di sprechi. Ma ricorda, se vuoi avere un livello performante, fluido e giocabile, l'unico modo è partire sin dall'inizio con in mente un layout concepito espressamente per l'ottimizzazione della Visiblità.
 
Ok questo è quanto. Se qualcosa non ti è chiaro, non esitare a postare le tue domande nel nostro Forum.

   




Creative Commons License
Visportals (Q4 engine games)
Tutorial by m4rcvs for HG&LD
- 19 ottobre 2006 -