Zagadnienia wydajnościowe dotyczące współdziałania Direct3D9 i WPF
Zawartość Direct3D9 można hostować przy użyciu klasy D3DImage. Hostowanie zawartości Direct3D9 może mieć wpływ na wydajność aplikacji. W tym temacie opisano najlepsze rozwiązania dotyczące optymalizacji wydajności podczas hostowania zawartości Direct3D9 w aplikacji Windows Presentation Foundation (WPF). Te najlepsze praktyki obejmują sposób używania D3DImage oraz najlepsze praktyki podczas korzystania z systemów Windows Vista, Windows XP i wielomonitorowych wyświetlaczy.
Notatka
Przykłady kodu, które pokazują te najlepsze rozwiązania, zobacz WPF i Direct3D9 Interoperation.
Używanie funkcji D3DImage oszczędnie
Zawartość Direct3D9 hostowana w wystąpieniu D3DImage nie jest renderowana tak szybko, jak w czystej aplikacji Direct3D. Kopiowanie powierzchni i opróżnianie buforu poleceń może być kosztowne. Wraz ze wzrostem liczby wystąpień D3DImage występuje większe opróżnianie i obniżenie wydajności. Dlatego należy użyć D3DImage oszczędnie.
Najlepsze rozwiązania w systemie Windows Vista
Aby uzyskać najlepszą wydajność w systemie Windows Vista z wyświetlaczem skonfigurowanym do używania modelu sterowników wyświetlania systemu Windows (WDDM), utwórz powierzchnię Direct3D9 na urządzeniu IDirect3DDevice9Ex
. Umożliwia to udostępnianie powierzchni. Karta wideo musi obsługiwać funkcje sterowników D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES
i D3DCAPS2_CANSHARERESOURCE
w systemie Windows Vista. Wszystkie inne ustawienia powodują skopiowanie powierzchni za pośrednictwem oprogramowania, co znacznie zmniejsza wydajność.
Notatka
Jeśli system Windows Vista ma wyświetlacz skonfigurowany do korzystania z modelu sterownika wyświetlania systemu Windows XP (XDDM), powierzchnia jest zawsze kopiowana za pośrednictwem oprogramowania, niezależnie od ustawień. Dzięki odpowiednim ustawieniom i karcie wideo zobaczysz lepszą wydajność w systemie Windows Vista, gdy używasz WDDM, ponieważ kopiowanie powierzchni odbywa się za pomocą sprzętu.
Najlepsze rozwiązania w systemie Windows XP
Aby uzyskać najlepszą wydajność w systemie Windows XP, który korzysta z modelu sterownika wyświetlania systemu Windows XP (XDDM), utwórz powierzchnię zablokowaną, która zachowuje się poprawnie po wywołaniu metody IDirect3DSurface9::GetDC
. Wewnętrznie metoda BitBlt
przenosi powierzchnię pomiędzy urządzeniami na poziomie sprzętowym. Metoda GetDC
zawsze działa na powierzchniach XRGB. Jeśli jednak komputer kliencki działa na systemie Windows XP z dodatkiem SP3 lub SP2 i klient ma także zainstalowaną poprawkę dla funkcji okna warstwowego, to metoda ta działa tylko na powierzchniach ARGB. Karta wideo musi obsługiwać możliwości sterownika D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES
.
16-bitowa głębokość ekranu pulpitu może znacznie zmniejszyć wydajność. Zalecany jest 32-bitowy system operacyjny dla komputerów stacjonarnych.
Jeśli programujesz dla systemów Windows Vista i Windows XP, przetestuj wydajność w systemie Windows XP. Brak pamięci wideo w systemie Windows XP jest problemem. Ponadto D3DImage w systemie Windows XP używa więcej pamięci i przepustowości niż Windows Vista WDDM, ze względu na wymaganą dodatkową kopię pamięci wideo. W związku z tym można oczekiwać, że wydajność będzie gorsza w systemie Windows XP niż w systemie Windows Vista dla tego samego sprzętu wideo.
Notatka
XDDM jest dostępny zarówno w systemach Windows XP, jak i Windows Vista; jednak WDDM jest dostępny tylko w systemie Windows Vista.
Ogólne najlepsze rozwiązania
Podczas tworzenia urządzenia użyj flagi D3DCREATE_MULTITHREADED
. Zmniejsza to wydajność, ale system renderowania WPF wywołuje metody na tym urządzeniu z innego wątku. Pamiętaj, aby prawidłowo postępować zgodnie z protokołem blokowania, aby żadne dwa wątki nie uzyskiwały dostępu do urządzenia w tym samym czasie.
Jeśli renderowanie jest wykonywane na zarządzanym wątku WPF, zdecydowanie zaleca się użycie flagi tworzenia D3DCREATE_FPU_PRESERVE
podczas tworzenia urządzenia. Bez tego ustawienia renderowanie D3D może zmniejszyć dokładność operacji podwójnej precyzji WPF i wprowadzić problemy z renderowaniem.
Układanie D3DImage jest szybkie, chyba że układasz powierzchnię inną niż pow2 bez wsparcia sprzętowego albo układasz DrawingBrush lub VisualBrush, które zawierają D3DImage.
Najlepsze rozwiązania dotyczące wyświetlania wielu monitorów
Jeśli używasz komputera z wieloma monitorami, należy postępować zgodnie z wcześniej opisanymi najlepszymi rozwiązaniami. Istnieją również pewne dodatkowe zagadnienia dotyczące wydajności konfiguracji z wieloma monitorami.
Podczas tworzenia buforu wejściowego jest on tworzony na określonym urządzeniu i adapterze graficznym, ale WPF może wyświetlać bufor wyjściowy na dowolnym adapterze. Kopiowanie między adapterami w celu zaktualizowania przedniego bufora może być bardzo kosztowne. W systemie Windows Vista skonfigurowanym do używania WDDM z wieloma kartami graficznymi i z urządzeniem IDirect3DDevice9Ex
, jeśli bufor przedni znajduje się na innym adapterze, ale wciąż na tej samej karcie graficznej, nie ma spadku wydajności. Jednak w systemie Windows XP i XDDM z wieloma kartami wideo występuje znaczny spadek wydajności, gdy bufor przedni jest wyświetlany na innym adapterze niż bufor tylny. Aby uzyskać więcej informacji, zobacz WPF i Direct3D9 Interoperation.
Podsumowanie wydajności
W poniższej tabeli przedstawiono wydajność aktualizacji buforu frontu jako funkcji systemu operacyjnego, formatu pikseli i możliwości blokowania powierzchni. Przyjmuje się, że bufor przedni i bufor wsteczny znajdują się na tym samym adapterze. W zależności od konfiguracji karty aktualizacje sprzętu są ogólnie znacznie szybsze niż aktualizacje oprogramowania.
Format pikseli powierzchni | Windows Vista, WDDM i 9Ex | Inne konfiguracje systemu Windows Vista | Windows XP SP3 lub SP2 z poprawką | Windows XP SP2 |
---|---|---|---|---|
D3DFMT_X8R8G8B8 (nie można zablokować) | Aktualizacja sprzętu | Aktualizacja oprogramowania | Aktualizacja oprogramowania | Aktualizacja oprogramowania |
D3DFMT_X8R8G8B8 (z możliwością blokowania) | aktualizacja sprzętu | Aktualizacja oprogramowania | Aktualizacja sprzętu | aktualizacja sprzętu |
D3DFMT_A8R8G8B8 (nie można zablokować) | aktualizacja sprzętu | Aktualizacja oprogramowania | Aktualizacja oprogramowania | Aktualizacja oprogramowania |
D3DFMT_A8R8G8B8 (z możliwością blokowania) | Aktualizacja sprzętu | Aktualizacja oprogramowania | Aktualizacja sprzętu | Aktualizacja oprogramowania |
Zobacz też
- D3DImage
- WPF i Direct3D9 Interoperacyjność
- Przewodnik: Tworzenie zawartości Direct3D9 na potrzeby hostingu w WPF
- Przewodnik : Integracja zawartości Direct3D9 w WPF
.NET Desktop feedback