Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 12 di 53
  • livello principiante
Indice lezioni

GraphicsDevice e Opzioni di Inizializzazione

Impostare i parametri di visualizzazione del gioco in relazione alla GPU
Impostare i parametri di visualizzazione del gioco in relazione alla GPU
Link copiato negli appunti

Il GraphicsDeviceManager ci permette di interagire con tutte le opzioni del GraphicsDevice. Il GraphicsDevice è il nostro principale intermediario con la GPU dell'hardware che esegue il nostro gioco, e, in quanto tale, ci permette di realizzare tutte le operazioni di disegno 2D e 3D, le allocazioni di memoria per textures o modelli e persino la creazione di render targets e shaders (seppure non su Windows Phone 7 alla versione 4.0 di XNA).

Il GraphicsDeviceManager è un sistema che ci permette di gestire al meglio le varie opzioni di creazione del GraphicsDevice, offrendo un servizio molto utile specialmente in sistemi come Windows in cui troviamo moltissime combinazioni possibili (risoluzione, profondità di colore, profondità del DepthStencilBuffer).

Il GraphicsDeviceManager crea un GraphicsDevice con le opzioni accettate dalla GPU più simili possibile a quelle richieste, evitando di doverle cercare. Ogni GPU infatti è dotata di restrizioni sulle combinazioni permesse e, vista l'enorme quantità di queste opzioni, sarebbe assai difficile effettuare ricerche. Per capire quante opzioni avremmo a disposizione, basti pensare alle possibili risoluzioni, che possono essere, ad esempio:

640×480,   600×400,   800×480,   800×600, 
1024×600,  1024×768,  ...

le profondità di colore del BackBuffer (il tipo di dato che rappresenta il colore di ciascun pixel) puó invece essere:

RGB@24 bit interi,        RGBA@32 bit interi,
RGBA@64 bit half float,   RGBA@128 bit float, ...

e a sua volta il DepthStencilBuffer (che mantiene le informazioni sulla profondità e sullo stencil) potrà essere:

Depth16 Stencil0
Depth24 Stencil0
Depth24 Stencil8

È interessante notare che man mano che XNA converge verso il modello di DirectX 10, sempre meno scelte vengono lasciate allo sviluppatore grazie ad un modello di hardware meno frammentato e più uniforme. Confrontare i possibili formati di DepthStencilBuffer (solo 3) con le decine disponibili in DirectX 9 permette di apprezzare questo utile fenomeno.

Impostiamo le proprietà desiderate del GraphicsDevice nel GraphicsDeviceManager: troviamo alcune proprietà che possiamo impostare nel costruttore (oppure in qualsiasi altro punto del codice ma dovremo poi invocare il metodo GraphicsDeviceManager.ApplySettings() per realizzare le modifiche).

Possiamo creare anche gli handler per i principali eventi coinvolti nella creazione del device, tramite gli eventi del GraphicsDeviceManager:

event EventHandler<EventArgs> DeviceCreated;
event EventHandler<EventArgs> DeviceDisposing;
event EventHandler<EventArgs> DeviceReset;
event EventHandler<EventArgs> DeviceResetting;
event EventHandler<PreparingDeviceSettingsEventArgs> PreparingDeviceSettings;

gli eventi Device* permettono di rispondere alla creazione, eliminazione e ripristino del GraphicsDevice. L'evento PreparingDeviceSettings ci permette di modificare le impostazioni del GraphicsDevice prima che esso venga creato, in modo da applicare piccole modifiche prima della creazione.

Le proprietà che possiamo impostare nel GraphicsDeviceManager sono:

Proprietà Tipo Descrizione
IsFullScreen bool determina se l'applicazione userà lo schermo intero oppure disegnerà la sua grafica in una finestra
PreferMultiSampling bool determina se l'applicazione cercherà di usare l'antialiasing qualora fosse disponibile
PreferredBackBufferFormat SurfaceFormat imposta la profondità di colore desiderata per rappresentare il colore dei pixels dello schermo
PreferredBackBufferHeight
PreferredBackBufferWidth
int impostano la risoluzione desiderata
PreferredDepthStencilFormat DepthFormat imposta il tipo di dato che rappresenterà i valori di profondità (z-buffer) e stencil in modo da determinarne la precisione
SupportedOrientations DisplayOrientation attiva o disattiva gli orientamenti per lo schermo di Windows Phone 7, in modo da permettere o meno di ruotare il telefono tra le modalità Portrait (verticale), Landscape Left (orizzontale verso sinistra) e Landscape Right (orizzontale verso destra)
SynchronizeWithVerticalRetrace bool apermette di scegliere se sincronizzare le invocazioni del metodo Draw con l'aggiornamento verticale dello schermo o meno
Figura 16. Orientamento del telefono
Orientamento del telefono

L'ultima opzione del GraphicsDeviceManager che possiamo impostare è il cosiddetto Profile. Vista la varietà di hardware su cui è possibile far girare i propri giochi XNA, è stata definita una divisione tra le piattaforme più potenti (XBox 360 e i PC Windows con hardware più avanzato) e tutte le altre (Windows Phone 7, XBox 360 e qualsiasi PC Windows con una qualsiasi GPU DirectX 10).

Impostando la proprietà:

graphics.GraphicsProfile = GraphicsProfile.HiDef;

stiamo consentendo alla nostra applicazione di utilizzare tutte le caratteristiche, anche le più complesse e avanzate come la creazione di shaders o di textures ad altissima risoluzione e profondità di colore. Questo significa che l'applicazione si rifiuterà di avviarsi su hardware giudicato insufficiente.

Scrivendo invece:

graphics.GraphicsProfile = GraphicsProfile.Reach;

limitiamo le caratteristiche utilizzabili dalla nostra applicazione, che però potrà girare su tantissime macchine, dai Windows Phone 7 ai PC Windows di fascia più bassa.

Il confronto dettagliato tra i profili Reach e HiDef è riassunto nella tabella seguente:

Reach HiDef
Modello di shaders 2.0
(Windows Phone 7 peró non supporta gli shaders scritti a mano)
3.0+
(l'XBox 360 supporta estensioni specifiche come vfetch che non sono disponibili sotto Windows) 
Max dimensione texture 2048 4096
Max dimensione cubemap 512 4096
Max dimensione volume texture Non supportate 256
Textures con dimensione non potenza di due Condizionale: non si possono usare il wrapping, le mipmaps o la compressione DXT
Cubemaps con dimensione non potenza di due No
Volume textures con dimensione non Potenza di due Non supportate
Max primitive in una chiamata a Draw 65535 1048575
Formati per gli indici 16 bit 16 e 32 bit
Formati per gli elementi dei vertici Color, Byte4, Single, Vector2, Vector3, Vector4, Short2, Short4, NormalizedShort2, NormalizedShort4 Gli stessi della modalità Reach più HalfVector2, HalfVector4
Formati di texture Color, Bgr565, Bgra5551, Bgra4444, NormalizedByte2, NormalizedByte4, Dxt1, Dxt3, Dxt5 Gli stessi della modalità Reach, più Alpha8, Rg32, Rgba64, Rgba1010102, Single, Vector2, Vector4, HalfSingle, HalfVector2, HalfVector4. I formati floating point non supportano filtraggio.
Formati di textures per vertex shaders Non supportato Single, Vector2, Vector4, HalfSingle, HalfVector2, HalfVector4
Render targets multipli No Fino a 4, ma con la stessa dimensione in bit per ciascun pixel. Supporto per alpha blending e maschere di scrittura indipendenti per ciascun render target
Occlusion queries No
Alpha blending separato No
Blend.SourceAlphaSaturation Solo per SourceBlend, non DestinationBlend Si
Massimo numero di streams di vertici 16 16
Massimo stride di vertice 255 255
Campo1 Descrizione1 Descrizione1
Campo1 Descrizione1 Descrizione1
Campo1 Descrizione1 Descrizione1

Ti consigliamo anche