Finde det korrekte device i Managed DirectX

Tags:    .net
Skrevet af Bruger #2730 @ 12.04.2004
Antallet af indstillinger når man instantierer et device i Managed DirectX er ret overvældende. Med alle de forskellige grafik kort der er på markedet i dag er det ikke muligt for en udvikler at huske på alle mulighederne for hver enkelt grafik kort, dette ændrer sig naturligvis løbende som grafik kort bliver bedre og bedre. Denne artikel har til formål at give en udvikler de nødvendige værktøjer til at finde antallet af tilgængelige devices på den maskine, hvor ens spil skal køre samt sørge for at det device er konfigureret optimalt for at lige nøjagtigt det spil du har udviklet kører bedst muligt. I denne artikel vil der blive gennemgået et par af de mest basale småting så som at enummerering af de devices der er tilgængelige på systemet, samt finde de understøtte formater for hvert device. Til dette formål udvikles der en applikation i C# .NET der lister alle devices og viser de formater de understøtter samt de egenskaber de ellers har. Alle eksempler i denne artikel benytter Visual Studio .Net 2003.

Indledning


For at denne artikel skal kunne forblive en begynder artikel i brugen af Managed DirectX, vil jeg for en sikkerheds skyld gennemgå hele ideen med Managed DirectX samt få slået at par ting helt på plads med hensyn til begreber. Managed DirectX er Microsofts implementering af et spil og grafik udviklings API der kommunikerer direkte med computerens grafikkort. Som pendent til DirectX kan nævnes OpenGL som i princippet gør det samme, men det er en anden implementering af 3D og håndtering af grafik. Managed DirectX er kommet med fra version 9.0 af Microsofts DirectX, dette er naturligvis gjort med henblik på at integrere det med Visual Studio .NET og .NET sprogene, herunder er C# måske mest interessant, da det er skrevet direkte med henblik på at kode .NET. Selve DirectX API et er gammelt, tidligere har det været et API man benyttede og tilgik "direkte på grafik kortet", det var meget besværlig at benytte og syntaksen var svær at gennemskue. Dette API eksisterer dog stadig, blot er der kommet et ekstra lag ind mellem .NET sprogene og selve DirectX API'et, der gør at man nu har objekter at tilgå, hvilket i sidste ende gør det hele nemmere for udvikleren. Omvendt betyder dette ekstra trin at det er en smule mere langsomt end almindelig DirectX, men det er næppe noget der mærkes med mindre man vil kode et kæmpestort 3D skydespil som eksempelvis Ghost Recon eller spil som Prince of Persia. Til almindelig spiludvikling som strategispil er der ikke nogen forringelse. I princippet kunne spil som eksempelvis "Age of Mythology" godt have været udviklet med Managed DirectX.



Så længe vi ikke laver de helt store 3D miljøer er Managed DirectX tilstrækkeligt. Som tidligere nævnt vil denne artikel gennemgå de indstillinger der kan findes på de devices der findes i den computer der kører det spil du har udviklet. Med device menes ikke grafik kort, men der menes den adapter der sidder på grafik kortet. Mange af de grafikkort der sælges i dag kan godt indeholde flere udgange således brugeren kan køre flere skærme. Det vil sige at der er to adapters på et sådan grafikkort.

Implementeringen


Der findes i Direct3D assemblyen en statisk klasse kaldet "Manager" der nemt kan benyttes til at enummerere de adapters der er på brugerens maskine. Den allerførste property i Manager klassen er en liste af adapters, denne property kan benyttes for forskellig vis, der findes blandt andet en count property der indeholder det antal adapters der er tilgængelig på maskinen hvor dette program
bliver eksekveret. For at demonstrere disse features vil vi nu udvikle en lille applikation der gør brug af disse features.

1. Opret et nyt C# Windows Forms projekt og giv det et passende navn.



2. tilføj referencer til Microsoft.DirectX.Direct3D og Microsoft.DirectX assembly'erne og tilføj den i din using klausul samtidig.



3. I design view for din applikation tilføj nu et TreeView og lad det lave docking til venstre side af dit vindue, tilføj samtidig

en splitter og lad den docke i venstre side også. Din applikation skulle nu gerne se således ud:



Det næste der skal gøres er at lave en lille funktion der vil scanne alle de adapters igennem der findes på systemet og liste dem i det TreeView vi har tilføjet til vores form. Tilføj nu følgende funktion til din applikation:

Fold kodeboks ind/udKode 

Denne funktion har tilførmål at gennemløbe alle de adapters der findes på systemet samt udskrive den nuværende opsætning og de understøttede display modes kortet understøtter. For at få noget ud af denne applikation skal vi have kaldt metoden vi netop har lavet. Lav en ny event handler på load eventen på vores form (dobbelt klik på load under events i højre side i property editoren) og tilføj følgende kode

Fold kodeboks ind/udKode 


Applikationen skulle nu gerne se ud som det nedenstående screenshot:



Umiddelbart kan det godt virke lidt uoverskueligt at forstå hvad det er der vises i vores TreeView. Ethvert af de formater vi får vist i vores træ kan bruges når vi skal udfylde vores present parameters (det er den struktur der rent faktisk renderer til skærmen i DirectX) som gyldig backbuffer. Format enummereringen følger et bestemt mønster, når der skal navngives de forskellige formater der understøttes. Mønstret består af et enkelt bogstav efterfulgt af et tal. Bogstavet repræsenterer data typen, mens tallet repræsenterer det antal bits af data der bliver benyttet i det valgte format. Disse bogstaver kan være følgende:

A - alpha
X - ubrugt
R - red
G - green
B - blue
L - luminance
P - palette

Summen af alle bits i formatet udgør den totale størrelse af formatet. Eksempelvis er formatet X8R8G8B8 et 32 bits format (8*4), hvor der er benyttet 8 bits til rød, 8 bits til grøn, 8 bits til blå samt 8 bits der er ubrugt.

Findes der et hardware device?


Når man i Managed DirectX kalder constructoren for et device, skal der angives et index for hvilken adapter der skal benyttes til at vise grafik med. Dette er relativt simpelt at finde ud af gennem den funktionalitet vi har lavet ovenover. Dog er det ikke ønskeligt at traversere gennem alle de formater der er tilgængelige for at finde det bedste format. Manager klassen hjælper os igen i dette tilfælde ved at tilbyde en funktionalitet der afgør om et bestemt format er understøttet af den adapter vi har valgt. Den nedenstående funktion akn benyttes til dette (den er en del af Microsoft.DirectX.Direct3D assemblyen):

Fold kodeboks ind/udKode 


Denne funktionalitet kan, som tidligere skrevet, benyttes til at finde ud af om det format man vælger at benytte til sit spil understøttes af grafikkortet. For hurtigt at gennemgå de parametre der sendes med denne metode. Det første parameter er den adapter man ønsker at lave sit check imod. Det andet parameter er den deviceType man ønsker at benytte, i størstedelen af alle tilfælde vil denne altid være DeviceType.Hardware. Tredje og fjerde er display formatet samt backbuffer formatet. Femte parameter er om man ønsker at køre i windowed mode eller i full screen mode. Sjette parameter er valgfrit, det vil returnere Integer koden (HRESULT i COM) for funktionen, det vil sige true hvis det er et korrekt deviceType og false hvis ikke det er.

Device capabilities


For hver enkelt lille ting et grafikkort kan eller ikke kan klare i hardware er der et item der hedder "capability", der findes en Capability struktur i Direct3D runtime der lister hver enkelt mulig "capability" et device understøtter. Når et device er oprettet kan man tilgå disse muligeder gennem en metode og se om de er til stede, men hvad nu hvis man vil kontrollere for dette inden man opretter sit device? Heldigvis er der også en metode til dette i Manager klassen. Vi vil nu tilføje en lille smule kode mere til vores applikation således vi kan se hvad vores valgte adapter understøtter. Tilføj nu en textBox til vores applikation, sæt dens dock til fill, sæt multiline til true og lad der være scrollbars både vertikalt og horisontalt. Vi vil nu hooke os på vores TreeViews AfterSelect event og tilføje følgende kode:

Fold kodeboks ind/udKode 


Hvis vi nu kører vores applikation vil vi se noget der ligner det nedenstående screenshot



Alt hvad der understøttes af en adapter listes i metoden GetDeviceCaps, det betyder at hvis adapteren understøtter Fogging (tåge) vil det være listet her.

Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (3)

User
Bruger #293 @ 26.04.04 22:47
God artikel, jeg sidder selv og leger lidt med Managed Direct3D indimellem.

Desværre ser det ikke ud som om interessen for det, eller .NET i det hele taget er så stor her på sitet endnu :) Det må vi da vist ha gjort noget ved :)

Håber du har mod på at skrive flere artikler om MDX, det er ihvertfald et spændende område :-)
User
Bruger #2730 @ 28.04.04 09:00
Jepsen, .NET er helt sikkert utroligt spændende og med Managed DirectX er det blevet endnu bedre. Jeg håber snart at kunne lave et par artikler omkring Managed DirectX, men har også et par andre .NET artikler på vej.
User
Bruger #6139 @ 05.04.05 09:09
Herlig artikel, jeg nyde altid at læse en god artikel af Brian Hvarregaard! Men nu er jeg selv lige begyndt at rode med .Net og jeg kan ikke lige finde Microsoft.DirectX og Microsoft.DirectX.Direct3D i reference biblioteket??
Du skal være logget ind for at skrive en kommentar.
t