Gerätetypen und Vertexverarbeitungsanforderungen (Direct3D 9)

Die Leistung von Scheitelpunktverarbeitungsvorgängen, einschließlich Transformation und Beleuchtung, hängt stark davon ab, wo der Scheitelpunktpuffer im Arbeitsspeicher vorhanden ist und welche Art von Renderinggerät verwendet wird. Anwendungen steuern die Speicherbelegung für Scheitelpunktpuffer, wenn sie erstellt werden. Wenn das D3DPOOL SYSTEMMEM-Speicherflag festgelegt ist, wird der _ Scheitelpunktpuffer im Systemspeicher erstellt. Wenn das D3DPOOL DEFAULT-Speicherflag verwendet wird, bestimmt der Gerätetreiber, wo der Arbeitsspeicher für den Scheitelpunktpuffer am besten zugeordnet wird, was häufig als treiberoptimaler _ Speicher bezeichnet wird. Treiberoptimaler Speicher kann lokaler Videospeicher, nicht lokaler Videospeicher oder Systemspeicher sein.

Das Festlegen der D3DUSAGE _ SOFTWAREPROCESSING-Konstante mit IDirect3DDevice9::CreateVertexBuffer ermöglicht die Softwarevertexverarbeitung für die Scheitelpunktpufferdaten. Dieses Flag ist für die Softwarevertexverarbeitung im gemischten Modus erforderlich. Das Flag darf nicht für den Hardwarevertexverarbeitungsmodus verwendet werden. Vertexpuffer, die bei der Softwarevertexverarbeitung verwendet werden, umfassen Folgendes:

Die Gründe, die Sie verwenden, um die Speicherposition – system- oder treiberoptimiert – für Scheitelpunktpuffer zu bestimmen, sind identisch mit denen für Texturen. Die Scheitelpunktverarbeitung, einschließlich Transformation und Beleuchtung, funktioniert in der Hardware am besten, wenn die Scheitelpunktpuffer im treiberoptimalen Speicher zugeordnet werden, während die Softwarevertexverarbeitung am besten mit Scheitelpunktpuffern funktioniert, die im Systemspeicher zugeordnet sind. Bei Texturen funktioniert die Hardwarerasterung am besten, wenn Texturen im treiberoptimierten Speicher zugeordnet werden, während die Softwarerasterung am besten mit Systemspeichertexturen funktioniert.

Microsoft Direct3D 9 unterstützt die eigenständige Verarbeitung von Scheitelgraden, ohne primitives Rendering mit der IDirect3DDevice9::P rocessVertices-Methode. Diese eigenständige Scheitelpunktverarbeitung wird immer in Software auf dem Hostprozessor ausgeführt. Aus diesem Grund müssen Scheitelpunktpuffer, die als Quellen verwendet werden, die mit IDirect3DDevice9::SetStreamSource festgelegt wurden, mit dem D3DUSAGE _ SOFTWAREPROCESSING-Flag erstellt werden. Die von IDirect3DDevice9::P rocessVertices bereitgestellte Funktionalität ist identisch mit der der Methoden IDirect3DDevice9::D rawPrimitive und IDirect3DDevice9::D rawIndexedPrimitive, während die Softwarevertexverarbeitung verwendet wird.

Wenn Ihre Anwendung eine eigene Scheitelpunktverarbeitung ausführt und transformierte, beleuchtete und abgeschnittene Scheitelpunkte an Renderingmethoden übergibt, kann die Anwendung Scheitelpunkte direkt in einen Scheitelpunktpuffer schreiben, der im treiberoptimierten Speicher zugeordnet ist. Diese Technik verhindert einen späteren redundanten Kopiervorgang. Beachten Sie, dass diese Technik nicht gut funktioniert, wenn Ihre Anwendung Daten aus einem Scheitelpunktpuffer zurück liest, da Lesevorgänge, die vom Host aus dem treiberoptimieren Speicher durchgeführt werden, sehr langsam sein können. Wenn Ihre Anwendung daher während der Verarbeitung lesen oder Daten erratisch in den Puffer schreiben muss, ist ein Systemspeicher-Scheitelpunktpuffer die bessere Wahl.

Bei Verwendung der Direct3D-Vertexverarbeitungsfeatures (durch Übergeben nicht übersetzter Scheitelpunkte an Scheitelpunktpuffer-Renderingmethoden) kann die Verarbeitung je nach Gerätetyp und Geräteerstellungsflags entweder in Hardware oder Software erfolgen. Es wird empfohlen, Scheitelpunktpuffer im Pool D3DPOOL DEFAULT zu verwenden, um in praktisch allen Fällen eine _ optimale Leistung zu erzielen. Wenn ein Gerät Hardwarevertexverarbeitung verwendet, gibt es eine Reihe zusätzlicher Optimierungen, die basierend auf den Flags D3DUSAGE DYNAMIC und _ D3DUSAGE WRITEONLY durchgeführt werden _ können. Weitere Informationen zur Verwendung dieser Flags finden Sie unter IDirect3DDevice9::CreateVertexBuffer.

Scheitelpunktpuffer