windows - Bedste praksis for Alt-Tab support i en DirectX app?

Indlæg af Hanne Mølgaard Plasc

Problem



Når du skriver DirectX-applikationer, er det naturligvis ønskeligt at understøtte brugeren, der suspenderer programmet via Alt - Tab på en måde, der er hurtig og fejlfri . Hvad er det bedste sæt praksis for at sikre dette? Ting, der skal løses, omfatter:



  1. De bedste metoder til at opdage, hvornår din ansøgning er blevet alt tabet ud af, og hvornår den er returneret til.

  2. Hvilke DirectX-ressourcer går tabt, når brugeren alt-faner, og de bedste måder at klare det på.

  3. Store ting at gøre og ting, der skal undgås i applikationsarkitekturen med henblik på alt-tab-support.

  4. Alle væsentlige forskelle mellem de store DirectX-versioner, som de gælder for ovenstående.



Interessante tricks og gotchas er også gode at høre om.

Bedste reference


Jeg vil antage, at du bruger C ++ med henblik på mine svar, men hvis du har råd til at bruge C #, er XNA (http://creators.xna.com/) en fremragende spilplatform, der håndterer alle disse problemer for dig. [1]


1]]


Denne artikel er nyttig til Windows-begivenheder i vinduet proceduren for at opdage, når et vindue taber eller får fokus, du kan håndtere dette på dit hovedvindue: http://www.functionx.com/win32/Lesson05.htm. Se også WM\_ACTIVATEAPP-meddelelsen her: http://msdn.microsoft.com/en-us/library/ms632614(VS.85).aspx[2][3]


2]]



  • Grafikkenheden går tabt, når applikationen mister fokus fra fuldskærmstilstand. Microsoft tilbyder en artikel om, hvordan man håndterer dette: http://msdn.microsoft.com/en-us/library/bb174717(VS.85).aspx Denne artikel har også en fortabt enhedstutorial: http://www.codesampler .com/dx9src/dx9src\_6.htm [4] [5]

  • DirectInput kan også have en enhed tabt fejltilstand, her er et link om det: http://www.toymaker.info/Games/html/directinput.html[6]

  • DirectSound kan også have en fejl i fejl i enheden, denne artikel indeholder kode, der håndterer det: http://www.eastcoastgames.com/directx/chapter2.html[7]



3]]


Jeg ville sørge for aldrig at deaktivere Alt-Tab. Du vil sandsynligvis have minimal CPU-belastning, mens applikationen ikke er aktiv, fordi brugeren sandsynligvis Alt-Tabbed fordi de vil gøre noget andet, så du kunne stoppe programmet helt eller reducere rammerne pr. Sekund. Hvis applikationen minimeres, behøver du selvfølgelig heller ikke at gøre noget. Efter at have tænkt på et netværksspil, er min bedste løsning, at du stadig skal reducere rammerne pr. Sekund såvel som mængden af ​​netværkspakker, der håndteres, muligvis selv smider væk mange af de pakker, der kommer ind, indtil spillet er genaktiveret.


4]]


Ærligvis vil jeg bare holde fast i DirectX 9.0c (eller DirectX 10, hvis du vil begrænse dit mål operativsystem til Vista og nyere) hvis det overhovedet er muligt :)


Endelig har DirectX sdk mange tutorials og prøver: http://www.microsoft.com/downloads/details.aspx?FamilyID=24a541d6-0486-4453-8641-1eee9e21b282u0026amp;displaylang=en[8]

Andre referencer 1


Vi løst det ved ikke at bruge en fullscreen DirectX-enhed overhovedet - i stedet brugte vi et fuldskærmsvindue med det øverste flag for at få det til at skjule proceslinjen. Hvis du alt-tab ud af det, kan du fjerne flag og minimere vinduet. Teksturressourcerne holdes i live ved vinduet.


Denne fremgangsmåde håndterer imidlertid ikke den hændte enhed, der sker på grund af 'låseskærm', Ctrl + Alt + Slet, fjernbordsforbindelser, brugerskifte eller lignende. Men de behøver ikke håndteres ekstremt hurtigt eller effektivt (ved mindst det var tilfældet i vores ansøgning)

Andre referencer 2


Alle seriøse D3D-apps skal kunne håndtere tabte enheder, da det er noget, der kan ske af en række forskellige årsager.


I DX10 under Vista er der en ny 'Timeout Detection and Recovery' -funktion, der gør det almindeligt i min erfaring, at grafiske enheder skal nulstilles, hvilket ville medføre en tabt enhed til din app. Dette ser ud til at blive bedre som bilister modne, men du skal alligevel håndtere det.

Andre referencer 3


I DX8 og 9 (og 10?), Hvis du opretter dine ressourcer (vertex og indeksbuffere og teksturer hovedsageligt) ved hjælp af D3DPOOL\_MANAGED, vil de fortsætte på tværs af tabte enheder og behøver ikke genindlæsning. Dette skyldes, at de er gemt i systemhukommelsen, og DX-runtime kopierer automatisk til videoudhukommelsen. Der er dog en præstationsomkostning på grund af kopiering, og dette anbefales ikke til hurtig skiftende vertex data. Selvfølgelig vil du profilere først for at afgøre, om der er et problem med hastighed :-)