Auswählen eines Geräts (Direct3D 9)

Anwendungen können Hardware abfragen, um die unterstützten Direct3D-Gerätetypen zu erkennen. Dieser Abschnitt enthält Informationen zu den wichtigsten Aufgaben, die mit dem Auflisten von Grafikkarten und der Auswahl von Direct3D-Geräten verbunden sind.

Eine Anwendung muss eine Reihe von Aufgaben ausführen, um ein geeignetes Direct3D-Gerät auszuwählen. Beachten Sie, dass die folgenden Schritte für eine Vollbildanwendung vorgesehen sind und dass eine Anwendung mit Fenstern in den meisten Fällen die meisten dieser Schritte überspringen kann.

  1. Zunächst muss die Anwendung die Grafikkarten auf dem System auflisten. Ein Adapter ist ein physisches Hardwarestück. Beachten Sie, dass die Grafik Karte mehr als einen einzelnen Adapter enthalten kann, wie dies bei einem dualen Display der Fall ist. Anwendungen, die sich nicht mit der Unterstützung für mehrere Monitore befassen, können diesen Schritt ignorieren und D3DADAPTER_DEFAULT in Schritt 2 an die IDirect3D9::EnumAdapterModes-Methode übergeben.

  2. Für jeden Adapter listet die Anwendung die unterstützten Anzeigemodi auf, indem IDirect3D9::EnumAdapterModes aufgerufen wird.

  3. Bei Bedarf überprüft die Anwendung, ob hardwarebeschleunigt in jedem aufgezählten Anzeigemodus vorhanden ist, indem IDirect3D9::CheckDeviceType aufgerufen wird, wie im folgenden Codebeispiel gezeigt. Beachten Sie, dass dies nur eine der möglichen Verwendungen für IDirect3D9::CheckDeviceType ist. Weitere Informationen finden Sie unter Ermitteln der Hardwareunterstützung (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. Die Anwendung überprüft die gewünschte Funktionalitätsebene für das Gerät auf diesem Adapter, indem sie die IDirect3D9::GetDeviceCaps-Methode aufruft . Die von dieser Methode zurückgegebene Funktion ist für ein Gerät über alle Anzeigemodi hinweg garantiert konstant, überprüft durch IDirect3D9::CheckDeviceType.

  5. Geräte können immer auf Oberflächen im Format eines enumerierten Anzeigemodus gerendert werden, der vom Gerät unterstützt wird. Wenn die Anwendung auf einer Oberfläche eines anderen Formats rendern muss, kann sie IDirect3D9::CheckDeviceFormat aufrufen. Wenn das Gerät im Format gerendert werden kann, ist garantiert, dass alle von IDirect3D9::GetDeviceCaps zurückgegebenen Funktionen anwendbar sind.

  6. Schließlich kann die Anwendung mithilfe der IDirect3D9::CheckDeviceMultiSampleType-Methode ermitteln, ob Multisamplingtechniken, wie z. B. antialiasing in einer vollständigen Szene, für ein Renderformat unterstützt werden.

Nach Abschluss der vorherigen Schritte sollte die Anwendung über eine Liste der Anzeigemodi verfügen, in denen sie arbeiten kann. Der letzte Schritt besteht darin, zu überprüfen, ob genügend auf das Gerät zugänglicher Arbeitsspeicher verfügbar ist, um die erforderliche Anzahl von Puffern und Antialiasing aufzunehmen. Dieser Test ist erforderlich, da der Arbeitsspeicherverbrauch für die Kombination aus Modus und Multisampel nicht vorhergesagt werden kann, ohne ihn zu überprüfen. Darüber hinaus verfügen einige Grafikkartenarchitekturen möglicherweise nicht über eine konstante Menge an Gerätezugriffsspeicher. Dies bedeutet, dass eine Anwendung beim Wechsel in den Vollbildmodus In der Lage sein sollte, Fehler bei out-of-video-memory zu melden. In der Regel sollte eine Anwendung den Vollbildmodus aus der Liste der Modi entfernen, die sie einem Benutzer bietet, oder sie sollte versuchen, weniger Arbeitsspeicher zu verbrauchen, indem sie die Anzahl der Backpuffer reduziert oder eine weniger komplexe Multisampling-Technik verwendet.

Eine Anwendung mit Fenstern führt einen ähnlichen Satz von Aufgaben aus.

  1. Es bestimmt das Desktoprechteck, das vom Clientbereich des Fensters abgedeckt wird.
  2. Es listet Adapter auf und sucht nach dem Adapter, dessen Monitor den Clientbereich abdeckt. Wenn sich der Clientbereich im Besitz mehrerer Adapter befindet, kann die Anwendung die einzelnen Adapter unabhängig steuern oder einen einzelnen Adapter antreiben und bei der Präsentation über Direct3D-Übertragungspixel von einem Gerät zu einem anderen verfügen. Die Anwendung kann auch zwei vorangehende Schritte ignorieren und den D3DADAPTER_DEFAULT-Adapter verwenden. Beachten Sie, dass dies zu einem langsameren Betrieb führen kann, wenn das Fenster auf einem sekundären Monitor platziert wird.
  3. Die Anwendung sollte IDirect3D9::CheckDeviceType aufrufen, um zu ermitteln, ob das Gerät das Rendern in einen Hintergrundpuffer des angegebenen Formats im Desktopmodus unterstützen kann. IDirect3D9::GetAdapterDisplayMode kann verwendet werden, um das Desktopanzeigeformat zu bestimmen, wie im folgenden Codebeispiel gezeigt.
    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-Geräte