Dela via


Välja en enhet (Direct3D 9)

Program kan köra frågor mot maskinvara för att identifiera de Direct3D-enhetstyper som stöds. Det här avsnittet innehåller information om de primära uppgifter som ingår i uppräkning av bildskärmskort och val av Direct3D-enheter.

Ett program måste utföra en serie uppgifter för att välja en lämplig Direct3D-enhet. Observera att följande steg är avsedda för ett helskärmsprogram och att ett fönsterbaserat program i de flesta fall kan hoppa över de flesta av dessa steg.

  1. Till en början måste programmet räkna upp bildskärmskorten i systemet. En adapter är en fysisk maskinvara. Observera att grafikkortet kan innehålla mer än en enda adapter, vilket är fallet med en dubbelskärmad display. Program som inte har stöd för flera övervakare kan bortse från det här steget och skicka D3DADAPTER_DEFAULT till IDirect3D9::EnumAdapterModes metod i steg 2.

  2. För varje adapter listar programmet de visningslägen som stöds genom att anropa IDirect3D9::EnumAdapterModes.

  3. Om det behövs söker programmet efter förekomsten av maskinvaruacceleration i varje uppräknat visningsläge genom att anropa IDirect3D9::CheckDeviceType, enligt följande kodexempel. Observera att detta bara är en av de möjliga användningsområdena för IDirect3D9::CheckDeviceType; Mer information finns i Determining Hardware Support (Direct3D 9).

    D3DPRESENT_PARAMETERS Params;
    // Initialize values for D3DPRESENT_PARAMETERS members. 
    
    Params.BackBufferFormat = D3DFMT_X1R5G5B5; 
    
    if(FAILED(m_pD3D->CheckDeviceType(Device.m_uAdapter, 
                      Device.m_DevType, 
                      Params.BackBufferFormat, Params.BackBufferFormat, 
                      FALSE))) 
        return E_FAIL;
    
  4. Programmet söker efter önskad funktionsnivå för enheten på det här kortet genom att anropa metoden IDirect3D9::GetDeviceCaps. Funktionen som returneras med den här metoden är garanterad konstant för en enhet i alla visningslägen, verifierad av IDirect3D9::CheckDeviceType.

  5. Enheter kan alltid rendera till ytor som har formatet av ett angivet visningsläge som stöds av enheten. Om programmet behöver återge till en yta med ett annat format kan det anropa IDirect3D9::CheckDeviceFormat. Om enheten kan återge formatet är det garanterat att alla funktioner som returneras av IDirect3D9::GetDeviceCaps är tillämpliga.

  6. Slutligen kan programmet avgöra om multisamplingstekniker, till exempel antialias i full scen, stöds för ett renderingsformat med hjälp av metoden IDirect3D9::CheckDeviceMultiSampleType.

När du har slutfört föregående steg bör programmet ha en lista över visningslägen där det kan användas. Det sista steget är att kontrollera att tillräckligt med enhetstillgängligt minne är tillgängligt för att hantera det nödvändiga antalet buffertar och antialias. Det här testet är nödvändigt eftersom minnesförbrukningen för läget och multisamplekombinationen är omöjlig att förutsäga utan att verifiera det. Dessutom kanske vissa bildskärmskortarkitekturer inte har en konstant mängd enhetstillgängligt minne. Det innebär att ett program ska kunna rapportera fel på grund av slut på videominne när det går i helskärmsläge. Vanligtvis bör ett program ta bort helskärmsläge från listan över lägen som erbjuds en användare, eller så bör det försöka förbruka mindre minne genom att minska antalet backbuffertar eller med hjälp av en mindre komplex multisamplingsteknik.

Ett fönsterprogram utför en liknande uppsättning uppgifter.

  1. Den avgör skrivbordsrektangeln som omfattas av fönstrets klientområde.
  2. Den räknar upp adaptrar och letar efter den adapter vars skärm täcker applikationsfönstret. Om klientområdet ägs av mer än en adapter kan programmet välja att köra varje adapter oberoende av de andra, eller att köra en enda adapter och låta Direct3D överföra pixlar från en adapter till en annan vid presentationen. Programmet kan också bortse från två föregående steg och använda D3DADAPTER_DEFAULT-adaptern. Observera att detta kan leda till långsammare prestanda när fönstret placeras på en sekundär skärm.
  3. Programmet bör anropa IDirect3D9::CheckDeviceType för att avgöra om enheten kan stödja återgivning till en buffert i det angivna formatet i skrivbordsläge. IDirect3D9::GetAdapterDisplayMode kan användas för att fastställa visningsformatet för skrivbordet, enligt följande kodexempel.
    D3DPRESENT_PARAMETERS Params;
    // Initialize values for D3DPRESENT_PARAMETERS members. 
    
    // Use the current display mode.
    D3DDISPLAYMODE mode;
    
    if(FAILED(m_pD3D->GetAdapterDisplayMode(Device.m_uAdapter , &mode)))
        return E_FAIL;
    
    Params.BackBufferFormat = mode.Format;
    
    if(FAILED(m_pD3D->CheckDeviceType(Device.m_uAdapter, Device.m_DevType, 
    Params.BackBufferFormat, Params.BackBufferFormat, FALSE)))
        return E_FAIL;
    

Direct3D-enheter