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 |
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 |
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 | Sì |
Cubemaps con dimensione non potenza di due | No | Sì |
Volume textures con dimensione non Potenza di due | Non supportate | Sì |
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 | Sì |
Alpha blending separato | No | Sì |
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 |