2009-06-09 5 views
37

Durante la scrittura di applicazioni DirectX, ovviamente, è auspicabile sostenere l'utente che sospende l'applicazione tramite Alt - Tab in un modo che è veloce e senza errori. Qual è la migliore serie di pratiche per garantire questo? Le cose che devono essere affrontate includono:Le migliori pratiche per il supporto di Alt-Tab in un'applicazione DirectX?

  1. I migliori metodi per rilevare quando l'applicazione è stata disattivata e quando è stata restituita.
  2. Quali risorse di DirectX vengono perse quando le schede alt utente e i modi migliori per far fronte a questo.
  3. Principali cose da fare e cose da evitare nell'architettura dell'applicazione ai fini del supporto di alt-tab.
  4. Eventuali differenze significative tra le versioni DirectX principali come si applicano a quanto sopra.

Interessanti trucchi e trucchi sono anche buoni da ascoltare.

+50

Si prega di inviare le risposte alle valvole ;-) – ebo

+3

Il collegamento campionatore codice postato qui sotto sembra adeguata per cominciare, quindi mi limiterò a aggiungi a: abbiamo scoperto che un modo semplice per verificare questa situazione è quello di eseguire l'applicazione in modalità finestra e blocca il desktop di Windows. In questo modo è possibile testare facilmente la situazione del dispositivo perso mentre si sta eseguendo localmente il debugger. – Kylotan

+0

non sono sicuro del motivo per cui stai selezionando Valve. Half-life è stato uno dei primi giochi che ho fatto alt-tab senza problemi. Se ci sono problemi è probabilmente a causa dello stesso DirectX (HL utilizzato OpenGL sul mio setup) – SpliFF

risposta

42

Suppongo che stiate usando C++ ai fini delle mie risposte, ma se potete permettervi di usare C#, XNA (http://creators.xna.com/) è un'eccellente piattaforma di gioco che gestisce tutti questi problemi per voi.

1]

Questo articolo è utile per finestre eventi nella window procedure per rilevare quando una finestra perde o guadagna fuoco, si poteva gestire questo sul tuo finestra principale: http://www.functionx.com/win32/Lesson05.htm. Inoltre, controllare il messaggio WM_ACTIVATEAPP qui: http://msdn.microsoft.com/en-us/library/ms632614(VS.85).aspx

2]

3]

Mi assicurerei di non disabilitare mai Alt-Tab. Probabilmente vuoi un carico minimo della CPU mentre l'applicazione non è attiva perché l'utente probabilmente Alt-Tabbed perché vuole fare qualcos'altro, in modo da poter sospendere completamente l'applicazione o ridurre i frame renderizzati al secondo. Se l'applicazione è minimizzata, ovviamente non è necessario eseguire alcun rendering. Dopo aver pensato a un gioco di rete, la mia soluzione migliore è che devi comunque ridurre i frame renderizzati al secondo e la quantità di pacchetti di rete gestiti, eventualmente anche buttare via molti dei pacchetti che arrivano fino a quando il gioco non viene riattivato.

4]

Onestamente vorrei solo bastone per DirectX 9.0c (o DirectX 10 Se si desidera limitare il sistema operativo di destinazione a Vista e successivi), se possibile :)

Infine, l'SDK DirectX ha numerosi tutorial e campioni: http://www.microsoft.com/downloads/details.aspx?FamilyID=24a541d6-0486-4453-8641-1eee9e21b282&displaylang=en

+1

La tua risposta sembra molto solida; Grazie! Credo che metterò questa domanda alla taglia quando il periodo di attesa è scaduto, poiché credo che sia un argomento importante che manca di risorse coerenti. Se sei incline a fare ulteriori modifiche alla tua risposta, ti suggerirei di riassumere i punti più alti dai vari link; Sarebbe bello se qualcuno alla ricerca di questo argomento potesse ottenere quante più informazioni rilevanti possibili nella risposta. (E i link sono, ovviamente, vulnerabili a linkrot.) – chaos

+0

Bel grafico verticale di reputazione. Sei piuttosto il cacciatore di taglie. :) – chaos

+0

Sì, sorpreso che non hanno un distintivo per questo! – jjxtra

1

In DX8 e 9 (e 10?) se crei le tue risorse (vertex e index buffer e trame principalmente) usando D3DPOOL_MANAGED esse si manterranno su dispositivi persi e non avranno bisogno di ricaricare. Questo perché sono memorizzati nella memoria di sistema e il runtime DX copia automaticamente nella memoria video. Tuttavia c'è un costo di prestazioni dovuto alla copia e questo non è raccomandato per cambiare rapidamente i dati dei vertici. Ovviamente dovresti prima stabilire il profilo per determinare se c'è un problema di velocità :-)

2

Abbiamo risolto il problema non utilizzando affatto un dispositivo DirectX a schermo intero, ma abbiamo usato una finestra a schermo intero con la bandiera più in alto per fare nasconde la barra delle applicazioni. Se non lo usi Alt-Tab, puoi rimuovere il flag e ridurre a icona la finestra. Le risorse texture sono mantenute vive dalla finestra.

Tuttavia, questo approccio non gestisce l'evento perso dispositivo a causa di "blocco schermo", Ctrl + Alt + Canc, connessioni desktop remoto, cambio utente o simili. Ma questi non devono essere gestiti in modo estremamente rapido o efficiente (almeno nella nostra applicazione)

2

Tutte le applicazioni D3D seria devono essere in grado di gestire i dispositivi persi in quanto ciò può accadere per una varietà di motivi.

In DX10 sotto Vista è presente una nuova funzione "Timeout Detection and Recovery" che rende comune nella mia esperienza la reimpostazione dei dispositivi grafici che causerebbe la perdita del dispositivo per l'app. Questo sembra migliorare man mano che i piloti maturano, ma è comunque necessario gestirli.

+0

Il miglior 'dispositivo perso', è quello causato da un aggiornamento del driver ;-) –

+0

Chortle chortle ma sul serio. Essere in grado di gestire il cambio di contesto e la possibilità di ripristinare lo stato è una parte importante della creazione di un'applicazione robusta in un ambiente multitasking. –

Problemi correlati