2014-01-16 6 views
0

응용 프로그램이 버퍼 (d3d 표면)로 그리는 도중에 DWM이 화면을 다시 그리기 위해 버퍼를 필요로하거나 그 반대의 경우 어떻게됩니까?DWM과 Direct3D 창 사이의 동기화

동기화 메커니즘이 있습니까?

답변

0

스왑 체인은 항상 둘 이상의 버퍼를 가지고 있으며 특정 시간에 DWM은 그 중 하나를 소유합니다. v-blank가 발생할 때까지 새 프레임이 Present()이 아닌 경우 DWM은 이미있는 버퍼를 사용하여 마지막 프레임을 다시 그립니다. 동기화는 현재 대기열을 포화 시키거나 (3 또는 그 이후의 호출 이후, 다음 대기열은 v- 공백까지 차단) 또는 수동으로 WaitForVBlank을 호출하여 수행 할 수 있습니다. Windows 8.1에서는보다 강력한 메커니즘을 IDXGISwapChain2::GetFrameLatencyWaitableObject을 사용하여 사용할 수 있습니다. DWM이 전체 OS UI를 정지시킬 것이므로 앱을 기다릴 수있는 방법은 없습니다.

+1

질문을 게시 한 후 좀 더 검색하고 [this] (http://blogs.msdn.com/b/greg_schechter/archive/2006/03/10/549310.aspx)와 [this] (http://stackoverflow.com/questions/1840516/is-double-buffering-required-with-desktop-composition-enabled) 게시. 그들은 창을 업데이트하는 중에 DWM으로 렌더링 할 수 있으므로 "구조적 찢김"이 발생할 수 있다고합니다. 이전 버전의 Windows에서만 가능합니까? – alice

+0

@alice 두 링크가 모두 "구조적 찢어짐"을 렌더링 중간에 표시하는 것처럼 보입니다. 'DrawTriangle(); 선물(); DrawRect();'분명히, 삼각형과 사각형이 동시에 나타나기를 의도한다면,이 호출 패턴은 올바른 효과를 내지 못합니다. 그것은 단지 나쁜 앱 로직 일뿐입니다. – MooseBoys