Dela via


Prestandaöverväganden för Direct3D9 och WPF-samverkan

Du kan vara värd för Direct3D9-innehåll med hjälp av klassen D3DImage. Att vara värd för Direct3D9-innehåll kan påverka programmets prestanda. I det här avsnittet beskrivs metodtips för att optimera prestanda när du är värd för Direct3D9-innehåll i ett WPF-program (Windows Presentation Foundation). Dessa metodtips omfattar hur du använder D3DImage och metodtips när du använder Windows Vista, Windows XP och bildskärmar med flera skärmar.

Not

Kodexempel som visar dessa metodtips finns i WPF och Direct3D9 Interoperation.

Använd D3DImage sparsamt

Direct3D9-innehåll som finns i en D3DImage instans återges inte lika snabbt som i ett rent Direct3D-program. Att kopiera ytan och rensa kommandobufferten kan vara kostsamma åtgärder. När antalet D3DImage instanser ökar sker mer tömning och prestanda försämras. Därför bör du använda D3DImage sparsamt.

Metodtips för Windows Vista

För bästa prestanda i Windows Vista med en skärm som är konfigurerad för att använda Windows Display Driver Model (WDDM), ska du skapa din Direct3D9-yta på en IDirect3DDevice9Ex-enhet. Detta möjliggör ytdelning. Grafikkortet måste ha stöd för D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES- och D3DCAPS2_CANSHARERESOURCE-drivrutinsfunktionerna i Windows Vista. Andra inställningar gör att ytan kopieras via programvara, vilket minskar prestanda avsevärt.

Notera

Om Windows Vista har en bildskärm som är konfigurerad för att använda Windows XP Display Driver Model (XDDM) kopieras ytan alltid via programvara, oavsett inställningar. Med rätt inställningar och grafikkort får du bättre prestanda i Windows Vista när du använder WDDM eftersom ytkopior utförs i maskinvaran.

Metodtips för Windows XP

För bästa prestanda i Windows XP, som använder Windows XP Display Driver Model (XDDM), skapar du en låsbar yta som fungerar korrekt när IDirect3DSurface9::GetDC-metoden anropas. Internt överför BitBlt-metoden ytan mellan enheter i maskinvaran. Metoden GetDC fungerar alltid på XRGB-ytor. Men om klientdatorn kör Windows XP med SP3 eller SP2, och om klienten också har snabbkorrigeringen för funktionen layered-window, fungerar den här metoden bara på ARGB-ytor. Grafikkortet måste ha stöd för D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES drivrutinsfunktionen.

Ett 16-bitars skrivbordsvisningsdjup kan avsevärt minska prestandan. Ett 32-bitars skrivbord rekommenderas.

Om du utvecklar för Windows Vista och Windows XP testar du prestanda på Windows XP. Det är ett problem att videominnet på Windows XP börjar ta slut. Dessutom använder D3DImage på Windows XP mer videominne och bandbredd än Windows Vista WDDM, på grund av en nödvändig extra videominneskopia. Därför kan du förvänta dig att prestandan blir sämre på Windows XP än på Windows Vista för samma videomaskinvara.

Note

XDDM finns på både Windows XP och Windows Vista. WDDM är dock endast tillgängligt i Windows Vista.

Allmänna metodtips

När du skapar enheten, använd flaggan D3DCREATE_MULTITHREADED. Detta minskar prestanda, men WPF-renderingssystemet anropar metoder på den här enheten från en annan tråd. Se till att följa låsningsprotokollet på rätt sätt så att inga två trådar kommer åt enheten samtidigt.

Om renderingen utförs på en WPF-hanterad tråd rekommenderar vi starkt att du skapar enheten med skapandeflaggan D3DCREATE_FPU_PRESERVE. Utan den här inställningen kan D3D-återgivningen minska noggrannheten för WPF-åtgärder med dubbel precision och introducera renderingsproblem.

Det går snabbt att kakla en D3DImage, om du inte kaklar en icke-pow2 yta utan maskinvarustöd, eller om du kaklar en DrawingBrush eller VisualBrush som innehåller en D3DImage.

Metodtips för visning av flera bildskärmar

Om du använder en dator som har flera bildskärmar bör du följa de tidigare beskrivna metodtipsen. Det finns också några ytterligare prestandaöverväganden för en konfiguration med flera övervakare.

När du skapar den bakre bufferten, skapas den på en specifik enhet och ett visst kort, men WPF kan visa den främre bufferten på vilket kort som helst. Det kan vara mycket dyrt att kopiera mellan adaptrar för att uppdatera frontbufferten. På Windows Vista, som är konfigurerat för att använda WDDM med flera grafikkort och med en IDirect3DDevice9Ex-enhet, om den främre bufferten är på en annan adapter men fortfarande samma grafikkort, finns det ingen prestandapåverkan. Men på Windows XP och XDDM med flera grafikkort finns det ett betydande prestandastraff när den "främre bufferten" visas på en annan adapter än den "bakre bufferten". Mer information finns i WPF och Direct3D9 Interoperation.

Prestandasammanfattning

I följande tabell visas prestanda för den främre buffertuppdateringen som en funktion av operativsystem, pixelformat och låsbarhet för ytan. Den främre bufferten och bufferten på baksidan antas finnas på samma adapter. Beroende på adapterkonfigurationen är maskinvaruuppdateringar vanligtvis mycket snabbare än programuppdateringar.

Surface Pixel-format Windows Vista, WDDM och 9Ex Andra Windows Vista-konfigurationer Windows XP SP3 eller SP2 med snabbkorrigering Windows XP SP2
D3DFMT_X8R8G8B8 (går inte att låsa) Maskinvaruuppdatering Programuppdatering Programuppdatering Programuppdatering
D3DFMT_X8R8G8B8 (låsbar) Maskinvaruuppdatering Programuppdatering Maskinvaruuppdatering Maskinvaruuppdatering
D3DFMT_A8R8G8B8 (går inte att låsa) Maskinvaruuppdatering Programuppdatering Programuppdatering Programuppdatering
D3DFMT_A8R8G8B8 (låsbar) Maskinvaruuppdatering Programuppdatering Maskinvaruuppdatering Programuppdatering

Se även