D3D / DXGI obsługuje przejście na pełny ekran

9

Mam aplikację D3D11 i chcę dodać odpowiednią obsługę pełnoekranową. Teraz mogę pozwolić, aby DXGI przełączyło moje okno na tryb pełnoekranowy i mam wrażenie, że DXGI zajmie się wszystkim, co jest potrzebne, aby łańcuch wymiany zamienił się w przód i backbuffer zamiast je zlewać.

Jednak zezwolenie DXGI na wykonanie przełącznika wydaje się niewiarygodne w przypadku konfiguracji z wieloma monitorami - ekrany dodatkowe pozostają całkowicie czarne po przełączeniu przez większość czasu, bez wyraźnego powodu lub wzorca.

Przełączanie się w tę iz powrotem może potrwać kilka razy, zanim pojawi się okno pełnoekranowe, a reszta pulpitu jest wyświetlana na innych ekranach.

Najwyraźniej nie jestem z tym sam, Battlefield 3 i WoW wydają się mieć podobne problemy dla wielu osób.

Teraz pytanie: chyba nawet te firmy produkujące gry AAA nie są w stanie tego uruchomić, mam największą nadzieję, że sam dokonam przejścia na pełny ekran.

Czy mogę coś zrobić, aby podnieść okno / swapchain do odpowiedniego trybu pełnoekranowego z przerzucaniem buforów?


źródło
W chwili pisania tego tekstu w bieżącej wersji World of Warcraft nie ma już wspomnianych problemów z konfiguracją trybu wyświetlania / wycieków pamięci. Były z pewnością problematyczne, ale zostały naprawione od 7.3.2
Gazer

Odpowiedzi:

3

Według mojej wiedzy jedyne, co działa, to:

 DwmEnableComposition(DWM_EC_DISABLECOMPOSITION);

na początku aplikacji i:

DwmEnableComposition(DWM_EC_ENABLECOMPOSITION);

przed wyjściem. W przypadku przejść postępuj jak zwykle. Próbowałem InvalidateRect(NULL, NULL, true)zaraz po przejściu na pełny ekran, ale bezskutecznie. Mam nadzieję że to pomoże.

Sójka
źródło
Po wypróbowaniu wszystkiego wydaje się, że masz rację. Tylko niezawodne wyłączenie kompozycji zapobiega temu. Nie była to odpowiedź, na którą liczyłem, ale chyba lepsza niż nic.
Pamiętaj, że system Windows 8.1 i nowsze wersje ignorują to ustawienie. Nie możesz wyłączyć DWM.
Chuck Walbourn,
1

Rzeczywiście nie jesteś jedynym, który zmaga się z tym problemem . Pierwsza rzecz do sprawdzenia: upewnij się, że używasz najnowszych sterowników / beta / najwyższej klasy dla używanej karty graficznej.

Powiedziałbym teraz, że jest tylko mała szansa, że ​​uda ci się uzyskać lepszą pracę niż automatyczna implementacja DXGI. Ten rodzaj problemu zależy w dużym stopniu od dostawcy adaptera, wersji sterownika i konfiguracji monitora. Więc ustawiając go na jednej maszynie, możesz skończyć zepsuciem go na więcej.

Odradzam powrót do ciemnych czasów DirectX 9, w których wszystko trzeba było robić ręcznie. Lepszym pomysłem byłoby spróbować naprawić automatyczne przełączanie. Kilka szlaków do naśladowania:

  • Przeczytaj uważnie (rzadką) dokumentację .

  • Jeśli jeszcze tego nie robisz, spróbuj zareagować na WM_SIZEzdarzenie, które pojawi się po przełączeniu z / na pełny ekran, jak opisano tutaj . Jeśli to zrobisz, upewnij się, że poprawnie usuwasz wszystkie odwołania do bufora tylnego przed wywołaniem ResizeBuffers, jak tam opisano . Niezastosowanie się do tego może spowodować tego rodzaju dziwne pół-problemy.

  • Spróbuj rozpocząć bezpośrednio na pełnym ekranie i utwórz łańcuch wymiany w jednym z wymienionych trybów wyświetlania . Jeśli to działa przez cały czas, może to oznaczać, że nie używasz jednego z wymienionych trybów wyświetlania podczas obsługi WM_SIZE(lub nie całkowicie, takie rzeczy jak częstotliwość odświeżania mogą być ważne).

  • Spróbuj wygrać z efektem zamiany i liczbą buforów w opisie łańcucha zamiany . Prawdopodobnie powinieneś używać DXGI_SWAP_EFFECT_SEQUENTIALa BufferCount> = 2. Być może twój sterownik ma słabą obsługę bardziej „egzotycznych” opcji.

Laurent Couvidou
źródło
Zmiana rozmiaru buforów działa dobrze. Próbowałem też wszystkich efektów zamiany, wydaje się, że nie mają znaczenia i zawsze używałem 2 buforów. Chciałbym wypróbować tryb pełnoekranowy (chociaż nie wiem, co masz na myśli mówiąc „używając jednego z wymienionych trybów wyświetlania” - odpowiadając na WM_SIZE, jedyne, co robię, to ResizeBuffers, nie ma miejsca na przekazanie trybu wyświetlania jako argumentu ), ale spontanicznie zainstalowałem system Windows 8 i domyślam się, że nie mogę teraz replikować problemu ..
Wróciłem do Windows7 i od samego początku próbowałem utworzyć swapchain na pełnym ekranie, ale problem nadal występuje.