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ż
.NET Desktop feedback
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla