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?
Odpowiedzi:
Według mojej wiedzy jedyne, co działa, to:
na początku aplikacji i:
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.źródło
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_SIZE
zdarzenie, 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łaniemResizeBuffers
, 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_SEQUENTIAL
aBufferCount
> = 2. Być może twój sterownik ma słabą obsługę bardziej „egzotycznych” opcji.źródło