VC DirectX Performance Frage

08/05/2012 23:40 xXxDarkheroxXx#1
Hallo und zwar habe ich eine frage zum DirectX 9 System (d3d9).
Beim einstellen des "BehaviorFlags" in
Code:
STDMETHOD(CreateDevice)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,HWND hFocusWindow,DWORD BehaviorFlags,D3DPRESENT_PARAMETERS* pPresentationParameters,IDirect3DDevice9** ppReturnedDeviceInterface) PURE;
Und zwar will ich dieses 3D System so viel wie möglich am GPU laufen lassen (Damit CPU freier ist).
Welches Flag soll ich nehmen?

Code:
#define D3DCREATE_FPU_PRESERVE                  0x00000002L
#define D3DCREATE_MULTITHREADED                 0x00000004L

#define D3DCREATE_PUREDEVICE                    0x00000010L
#define D3DCREATE_SOFTWARE_VERTEXPROCESSING     0x00000020L
#define D3DCREATE_HARDWARE_VERTEXPROCESSING     0x00000040L
#define D3DCREATE_MIXED_VERTEXPROCESSING        0x00000080L

#define D3DCREATE_DISABLE_DRIVER_MANAGEMENT     0x00000100L
#define D3DCREATE_ADAPTERGROUP_DEVICE           0x00000200L
#define D3DCREATE_DISABLE_DRIVER_MANAGEMENT_EX  0x00000400L
Ich denke D3DCREATE_HARDWARE_VERTEXPROCESSING+D3DCREATE_PURE DEVICE sollten am besten sein (Wär dann 0x00000050L) (nachdem die "supported?" Abfragen gemacht wurden).

Stimmt dies?
08/06/2012 00:07 MrSm!th#2
Gibt es nicht ein Flag, dass automatisch alles auf GPU läuft, was unterstützt wird und der Rest läuft dann auf der CPU?
08/06/2012 00:13 xXxDarkheroxXx#3
wahrscheinlich nicht, aber diesem examplecode her sollte das das optimum sein:
Code:
    D3DCAPS9 caps;
    d3dObject->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);

    DWORD devBehaviorFlags = 0;
    if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
          devBehaviorFlags |= D3DCREATE_HARDWARE_VERTEXPROCESSING;
    else
          devBehaviorFlags |= D3DCREATE_SOFTWARE_VERTEXPROCESSING;

    // If pure device and HW T&L supported
    if( caps.DevCaps & D3DDEVCAPS_PUREDEVICE &&
          devBehaviorFlags & D3DCREATE_HARDWARE_VERTEXPROCESSING)
                devBehaviorFlags |= D3DCREATE_PUREDEVICE;
Kann dies stimmen?

EDIT:
Hab eine gute erklärung gefunden:
Diese Eigenschaft bestimmt wie die Direct3D-Engine mit Vertexen, Texturen, Lighting usw. umgeht. Die beste Option hier ist D3DCEATE_PUREDEVICE - allerdings unterstützen nur wenige Grafikkarten diese Option(selbst die relativ neue TnL Geforce 256 nicht) Diese Option heißt, dass die Grafikkarte fasst alles übernimmt - Transformatierung, Schatten, Lighting, Texturen and Rasterung. Wenn ihre Hardware das nicht unterstützt ist das nächstbeste D3DCREATE_HARDWARE_VERTEXPROCESSING - diese Option benutzt Hardware so oft wie möglich; die meisten aktuellen 3D-Karten sollten diese Option unterstützen. Falls auch das schief läuft, können Sie es mit der Option D3DCREATE_MIXED_VERTEXPROCESSING versuchen, welche die Hardware benutzt, wenn es aber nicht geht, dann springen die Software-Komponenten ein. Die letzte Möglichkeit ist dann nur noch der Software-Rasterer und falls die Hardware kein 3D unterstützt, bleibt das die letzte Option. Der Software-Rasterer ist zwar fast immer sehr langsam und ist auch nicht sehr gut zu benutzten. Falls Sie nicht darumkommen: D3DCREATE_SOFTWARE_VERTEXPROCESSING.

[Only registered and activated users can see links. Click Here To Register...]
08/06/2012 20:02 MrSm!th#4
Quote:
wahrscheinlich nicht, aber diesem examplecode her sollte das das optimum sein:
Doch, für DX9 gibt es das.
08/07/2012 14:27 xXxDarkheroxXx#5
Code:
#define D3DCREATE_MIXED_VERTEXPROCESSING        0x00000080L
Das könntest du vllt. gemeint haben, mehr Behaviour flags gibt es seitens Microsoft nicht.
08/07/2012 16:45 tnd0#6
In dx9 ist es so, dass du beim öffnen des devices (CreateDevice und andere funktionen) angeben kannst, wo die vertices berechnet werden. Da hast du afaik zur auswahl "CPU", "GPU", "Automatic", "MIXED" und "Debug". Mehr kannst du daran nicht machen. Du musst immer mit der CPU Daten an die GPU schicken und die GPU wird diese Daten dann berechnen (sofern nicht beim Erstellen mit den obigen Flags anders gewünscht). Mehr performance kannst du da auch nicht rausholen. Erst mit DX11 kannst du mit mehreren Threads (mehreren CPUCores) Daten an die GPU schicken (die x-buffer binden). Aber hier ist der Performancegain nur relativ gering.

Das 'PureDevice' dingsbums ist quasi eine emulation von Shadern. Die kann man erst mit DX11 (dx10? weiß ich nicht) so wirklich performant benutzen. Vorrausetzung dafür ist eine DirectX11 fähige GPU und Windows Vista/7/8. Also kannste dann auch gleich DX11 nehmen (oder openGL, was das schon seit 2007 oder so unterstützt).