Gerätetypen und Vertexverarbeitungsanforderungen (Direct3D 9)

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

Das Festlegen der D3DUSAGE_SOFTWAREPROCESSING Konstanten mit IDirect3DDevice9::CreateVertexBuffer ermöglicht die Softwarevertexverarbeitung für die Vertexpufferdaten. Dieses Flag ist für die Softwarevertexverarbeitung im gemischten Modus erforderlich. Das Flag wird möglicherweise nicht für den Hardwarevertexverarbeitungsmodus verwendet. Vertexpuffer, die bei der Softwarevertexverarbeitung verwendet werden, umfassen Folgendes:

Die Begründung, die Sie verwenden, um den Speicherort des Arbeitsspeichers (system- oder treiberoptimiert) für Vertexpuffer zu bestimmen, ist die gleiche wie für Texturen. Die Vertexverarbeitung, einschließlich Transformation und Beleuchtung, in Hardware funktioniert am besten, wenn die Vertexpuffer im treiberoptimalen Speicher zugeordnet werden, während die Softwarevertexverarbeitung am besten mit Vertexpuffern 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 Scheitelpunkten, ohne primitive Elemente mit der IDirect3DDevice9::P rocessVertices-Methode zu rendern . Diese eigenständige Vertexverarbeitung wird immer in Software auf dem Hostprozessor ausgeführt. Daher müssen Vertexpuffer, die als Quellen verwendet werden, die mit IDirect3DDevice9::SetStreamSource festgelegt sind, mit dem flag D3DUSAGE_SOFTWAREPROCESSING erstellt werden. Die von IDirect3DDevice9::P rocessVertices bereitgestellte Funktionalität ist mit denen der Methoden IDirect3DDevice9::D rawPrimitive und IDirect3DDevice9::D rawIndexedPrimitive identisch, während die Softwarevertexverarbeitung verwendet wird.

Wenn Ihre Anwendung eine eigene Vertexverarbeitung ausführt und transformierte, beleuchtete und beschnittene Scheitelpunkte an Renderingmethoden übergibt, kann die Anwendung Scheitelpunkte direkt in einen Vertexpuffer schreiben, der im treiberoptimierten Speicher zugeordnet ist. Mit dieser Technik wird später ein redundanter Kopiervorgang verhindert. Beachten Sie, dass diese Technik nicht gut funktioniert, wenn Ihre Anwendung Daten aus einem Vertexpuffer zurückliest, da Lesevorgänge, die vom Host aus dem treiberoptimalen Speicher ausgeführt werden, sehr langsam sein können. Wenn Ihre Anwendung während der Verarbeitung Daten lesen oder fehlergesteuert in den Puffer schreibt, ist daher ein Vertexpuffer mit System-Memory die bessere Wahl.

Bei Verwendung der Direct3D-Vertexverarbeitungsfeatures (durch Übergeben von nicht übersetzten Scheitelpunkten an Vertexpufferrenderingmethoden) kann die Verarbeitung abhängig vom Gerätetyp und den Geräteerstellungsflags entweder in Hardware oder Software erfolgen. Es wird empfohlen, Vertexpuffer im Pool D3DPOOL_DEFAULT zuzuweisen, um in praktisch allen Fällen eine optimale Leistung zu erzielen. Wenn ein Gerät die 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.

Vertexpuffer