Udostępnij za pośrednictwem


Zagadnienia dotyczące współdziałania Direct3D9 i WPF

Zawartość Direct3D9 można hostować przy użyciu D3DImage klasy . 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 rozwiązania obejmują sposób użycia D3DImage i najlepszych rozwiązań w przypadku korzystania z systemu Windows Vista, Windows XP i wyświetlaczy z wieloma monitorami.

Uwaga

Przykłady kodu demonstrujące te najlepsze rozwiązania można znaleźć w temacie WPF i Direct3D9 Interoperation (Interoperacja WPF i Direct3D9).

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 D3DImage wystąpień następuje większe opróżnianie i obniżenie wydajności. W związku z tym należy używać D3DImage oszczędnie.

Najlepsze rozwiązania w systemie Windows Vista

Aby uzyskać najlepszą wydajność w systemie Windows Vista z wyświetlaczem skonfigurowanym do korzystania z 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ść.

Uwaga

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 ustawieniu i karcie wideo zobaczysz lepszą wydajność w systemie Windows Vista, gdy używasz WDDM, ponieważ kopie powierzchni są wykonywane na sprzęcie.

Najlepsze rozwiązania w systemie Windows XP

Aby uzyskać najlepszą wydajność w systemie Windows XP, który używa modelu sterownika wyświetlania systemu Windows XP (XDDM), utwórz powierzchnię zablokowaną, która zachowuje się poprawnie po wywołaniu IDirect3DSurface9::GetDC metody. Wewnętrznie metoda przenosi powierzchnię między urządzeniami w sprzęcie BitBlt . Metoda GetDC zawsze działa na powierzchniach XRGB. Jeśli jednak na komputerze klienckim jest uruchomiony system Windows XP z dodatkiem SP3 lub SP2, a jeśli klient ma również poprawkę dla funkcji okna warstwowego, ta metoda działa tylko na powierzchniach ARGB. Karta wideo musi obsługiwać D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES możliwość sterownika.

16-bitowa głębokość ekranu pulpitu może znacznie zmniejszyć wydajność. Zalecany jest 32-bitowy pulpit.

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 wideo 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.

Uwaga

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 tworzenia. 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 w wątku zarządzanym WPF, zdecydowanie zaleca się utworzenie urządzenia z flagą D3DCREATE_FPU_PRESERVE tworzenia. Bez tego ustawienia renderowanie D3D może zmniejszyć dokładność operacji podwójnej precyzji WPF i wprowadzić problemy z renderowaniem.

Układanie elementu D3DImage jest szybkie, chyba że kafelek powierzchni nie pow2 bez obsługi sprzętu lub jeśli kafelek DrawingBrush lub VisualBrush zawiera D3DImageelement .

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 wstecznego jest tworzony na określonym urządzeniu i karcie, ale WPF może wyświetlać bufor przedni na dowolnej karcie. Kopiowanie między adapterami w celu zaktualizowania buforu frontu może być bardzo kosztowne. W systemie Windows Vista, który jest skonfigurowany do używania WDDM z wieloma kartami wideo i IDirect3DDevice9Ex z urządzeniem, jeśli bufor frontu znajduje się na innej karcie, ale nadal tej samej karty wideo, nie ma kary za wydajność. Jednak w systemie Windows XP i XDDM z wieloma kartami wideo występuje znaczna kara za wydajność, gdy bufor przedni jest wyświetlany na innej karcie niż bufor tylny. Aby uzyskać więcej informacji, zobacz Interoperation WPF i Direct3D9.

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 tej samej karcie. 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 z dodatkiem SP3 lub SP2 w/ poprawka Windows XP z dodatkiem 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ż