전체 화면 전환을 처리하는 D3D / DXGI


9

D3D11 응용 프로그램이 있는데 적절한 전체 화면 지원을 추가하고 싶습니다. 이제 DXGI가 창을 전체 화면으로 전환하도록 할 수 있습니다. DXGI가 스왑 체인을 앞뒤로 완충시키는 데 필요한 모든 것을 처리하는 대신 처리합니다.

그러나 멀티 모니터 설정에서 DXGI가 샌드위치를 ​​수행하게하는 것은 신뢰할 수없는 것처럼 보입니다. 부차적 인 화면은 아무런 이유나 패턴없이 스위치가 오랜 시간이 지난 후에도 완전히 검은 색으로 유지됩니다.

그것은 몇 번 스위칭 다시 걸릴 수 있습니다 갔다 나는 전체 화면 창 도착하기 전에 바탕 화면의 나머지는 다른 화면에 표시된다.

분명히 나는 ​​이것에 혼자가 아닙니다. Battlefield 3와 WoW는 많은 사람들에게 비슷한 문제가있는 것 같습니다.

실제 질문 : AAA 게임 개발 회사 조차도이 기능을 수행 할 수 없기 때문에 가장 큰 희망은 어떻게 든 자신을 전체 화면으로 전환하는 것입니다.

창 / 스왑 체인을 적절한 버퍼 충돌 풀 스크린 모드로 높이기 위해 할 수있는 일이 있습니까?


이 글을 쓰는 시점에서 현재 버전의 World of Warcraft에는 더 이상 언급 한 디스플레이 모드 구성 문제 / 메모리 누수가 없습니다. 그들은 확실히 문제가 있었지만 7.3.2에서 수정되었습니다
Gazer

답변:


3

내 지식으로는 작동하는 유일한 것입니다.

 DwmEnableComposition(DWM_EC_DISABLECOMPOSITION);

응용 프로그램을 시작할 때

DwmEnableComposition(DWM_EC_ENABLECOMPOSITION);

종료하기 전에. 전환의 경우 평소와 같이 진행하십시오. 나는 InvalidateRect(NULL, NULL, true)전체 화면으로 전환 한 직후에 시도했다 . 도움이 되었기를 바랍니다.


모든 것을 시도한 후에는 당신이 옳은 것 같습니다. 컴포지션을 비활성화하면이 문제가 발생하지 않습니다. 내가 바랐던 대답은 아니지만 내가 생각한 것보다 낫습니다.

Windows 8.1 이상에서는이 설정이 무시됩니다. DWM을 비활성화 할 수 없습니다.
척 Walbourn

1

당신은 이 문제에 직면 한 유일한 사람이 아닙니다 . 가장 먼저 확인해야 할 사항 : 사용중인 비디오 카드에 최신 / 베타 / 최고급 드라이버를 사용하고 있는지 확인하십시오.

이제 자동 DXGI 구현보다 더 잘 작동 할 수있는 기회 는 거의 없다고 말하고 싶습니다 . 이러한 종류의 문제는 어댑터 공급 업체, 드라이버 버전 및 모니터 구성에 따라 크게 달라집니다. 따라서 한 대의 컴퓨터에 고정하면 더 많은 컴퓨터가 고장날 수 있습니다.

모든 것을 직접해야하는 DirectX 9의 어두운 시대로 돌아 가지 말 것을 권합니다. 더 좋은 아이디어는 자동 전환을 수정하는 것입니다. 따라야 할 길 :

  • (희소 한) 문서를 주의 깊게 읽으십시오 .

  • 아직 수행하지 않은 경우 여기에 설명 된대로WM_SIZE 전체 화면에서 전체 화면으로 전환 할 때 수신되는 이벤트 에 응답 하십시오 . 그렇게하는 ResizeBuffers경우 , 설명 된대로 호출하기 전에 백 버퍼에 대한 모든 참조를 올바르게 해제했는지 확인하십시오 . 그렇게하지 않으면 이런 종류의 이상한 반 문제가 발생할 수 있습니다.

  • 전체 화면에서 직접 시작하고 열거 된 디스플레이 모드 중 하나를 사용하여 스왑 체인을 만듭니다 . 이것이 항상 작동하면 처리 할 때 열거 된 디스플레이 모드 중 하나를 사용하지 않는 것 WM_SIZE(또는 새로 고침 빈도와 같은 것이 중요하지 않음)을 의미 할 수 있습니다.

  • 스왑 효과와 스왑 체인 설명 의 버퍼 수로 문제를 해결하십시오 . 아마 > = 2를 사용 DXGI_SWAP_EFFECT_SEQUENTIAL하고 있을 것입니다 BufferCount. 아마도 드라이버가 더 "이국적인"옵션을 제대로 지원하지 않을 수 있습니다.


버퍼 크기를 조정하면 정상적으로 작동합니다. 나는 또한 모든 스왑 효과를 시도했지만 차이가없는 것처럼 보이며 항상 2 개의 버퍼를 사용했습니다. 전체 화면으로 시도해 볼 것입니다. "열거 된 디스플레이 모드 중 하나를 사용하여 무엇을 의미하는지 모르겠지만"-WM_SIZE에 응답 할 때 ResizeBuffers 만하면 디스플레이 모드를 인수로 전달할 곳이 없습니다 ) 그러나 나는 자발적으로 Windows 8을 설치하고 지금, 문제를 복제 할 수없는 것 같아요 ..

windows7로 돌아가서 처음부터 스왑 체인을 전체 화면으로 만들려고했지만 문제가 지속됩니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.