DXGI 대칭 이동 모델

Windows 8 DXGI 1.2에서 대칭 이동 프레젠테이션 모델 및 관련 현재 통계에 대한 지원을 추가합니다. Windows 8 DXGI 대칭 이동 프레젠테이션 모델은 Windows 7의 Direct3D 9EX 대칭 이동 모드 프레젠테이션과 비슷합니다. 게임과 같은 비디오 또는 프레임 속도 기반 프레젠테이션 앱은 플립 프레젠테이션 모델을 사용하여 가장 큰 이점을 얻을 수 있습니다. DXGI 플립 프레젠테이션 모델을 사용하는 앱은 시스템 리소스 부하를 줄이고 성능을 향상시킵니다. 또한 앱은 플립 프레젠테이션 모델에서 현재 통계 개선 사항을 사용하여 실시간 피드백 및 수정 메커니즘을 제공하여 프레젠테이션 속도를 더 잘 제어할 수 있습니다.

DXGI 대칭 이동 모델과 BitBlt 모델 비교

런타임은 비트 블록 전송(비트블렛) 및 대칭 이동 프레젠테이션 모델을 사용하여 디스플레이 모니터에 그래픽 콘텐츠를 표시합니다. 비트블렛과 대칭 이동 프레젠테이션 모델의 가장 큰 차이점은 백 버퍼 콘텐츠가 컴퍼지션을 위해 Windows 8 DWM에 도착하는 방법입니다. 비트블렛 모델에서 백 버퍼의 내용은 IDXGISwapChain1::P resent1에 대한 각 호출에서 리디렉션 화면에 복사됩니다. 대칭 이동 모델에서 모든 백 버퍼는 DWM(데스크톱 창 관리자)과 공유됩니다. 따라서 DWM은 추가 복사 작업 없이 해당 백 버퍼에서 바로 구성할 수 있습니다. 일반적으로 대칭 이동 모델이 더 효율적입니다. 또한 대칭 이동 모델은 향상된 현재 통계와 같은 더 많은 기능을 제공합니다.

Windows GDI(그래픽 디바이스 인터페이스)를 사용하여 HWND 에 직접 쓰는 레거시 구성 요소가 있는 경우 비트블릿 모델을 사용합니다.

DXGI 대칭 이동 모델의 성능 향상은 앱이 창 모드에 있을 때 중요합니다. 이 표의 시퀀스와 그림에서는 대칭 이동 모델과 비트블렛 모델을 선택하는 창이 있는 앱의 시스템 읽기 및 쓰기와 메모리 대역폭 사용량을 비교합니다.

단계 DWM에 있는 BitBlt 모델 DWM에 있는 DXGI 대칭 이동 모델
1. 앱이 프레임을 업데이트합니다(쓰기).
앱이 프레임을 업데이트합니다(쓰기).
2. Direct3D 런타임은 표면 콘텐츠를 DWM 리디렉션 화면에 복사합니다(읽기, 쓰기).
Direct3D 런타임이 앱 화면을 DWM에 전달합니다.
3. 공유 표면 복사가 완료되면 DWM은 앱 화면을 화면에 렌더링합니다(읽기, 쓰기).
DWM은 앱 화면을 화면에 렌더링합니다(읽기, 쓰기).

 

Blt 모델 및 대칭 이동 모델 비교 그림

대칭 이동 모델은 DWM의 창 프레임 컴퍼지션에 대한 Direct3D 런타임의 읽기 및 쓰기 수를 줄여 시스템 메모리 사용량을 줄입니다.

DXGI 대칭 이동 모델을 사용하는 방법

Windows 8 대상으로 하는 Direct3D 11.1 앱은 DXGI_SWAP_CHAIN_DESC1 구조체SwapEffect 멤버에 설정된 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 열거형 값으로 스왑 체인을 만들어 대칭 이동 모델을 사용합니다. SwapEffectDXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 설정하면 이러한 DXGI_SWAP_CHAIN_DESC1 멤버도 표시된 값으로 설정합니다.

  • 이전 프레젠테이션 버퍼를 해제하기 위해 DWM에서 대기한 결과로 성능 저하를 방지하기 위해 BufferCount를 2에서 16 사이의 값으로 설정합니다.
  • 서식 을 DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_B8G8R8A8_UNORM 또는 DXGI_FORMAT_R8G8B8A8_UNORM
  • 여러 샘플 앤티앨리어싱(MSAA)이 지원되지 않으므로 SampleDesc 멤버가 1에 지정하는 DXGI_SAMPLE_DESC구조체개수 멤버와 DXGI_SAMPLE_DESC 품질 멤버를 0으로 계산합니다.

Windows 7 또는 이전 운영 체제에서 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 사용하는 경우 디바이스 만들기가 실패합니다. 대칭 이동 모델을 사용하는 경우 창 모드에서 전체 화면 표시 통계를 사용할 수 있습니다. 전체 화면 동작은 영향을 받지 않습니다. 창이 있는 스왑 체인에 대해 IDXGIFactory2::CreateSwapChainForHwndpFullscreenDesc 매개 변수에 NULL을 전달하고 SwapEffectDXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 설정하는 경우 런타임은 하나의 추가 백 버퍼를 만들고 프레젠테이션 시 전면 버퍼가 되는 버퍼에 속하는 핸들을 회전합니다.

대칭 이동 모델을 사용하는 경우 다음 팁을 고려합니다.

  • HWND당 하나의 대칭 이동 모델 스왑 체인을 사용합니다. 여러 대칭 이동 모델 스왑 체인을 동일한 HWND로 대상으로 지정하지 마세요.
  • GDI의 ScrollWindow 또는 ScrollWindowEx 함수와 함께 대 칭 이동 모델 스왑 체인을 사용하지 마세요. 일부 Direct3D 앱은 GDI의 ScrollWindowScrollWindowEx 함수를 사용하여 사용자 스크롤 이벤트가 발생한 후 창 콘텐츠를 업데이트합니다. ScrollWindowScrollWindowEx 는 사용자가 창을 스크롤할 때 화면에서 창 내용의 비트blt를 수행합니다. 이러한 함수에는 GDI 및 Direct3D 콘텐츠에 대한 비트블릿 모델 업데이트도 필요합니다. 두 함수 중 하나를 사용하는 앱은 앱이 창 모드에 있을 때 화면에 표시되는 창 내용이 반드시 표시되지는 않습니다. GDI의 ScrollWindowScrollWindowEx 함수를 사용하지 말고 스크롤에 대한 응답으로 화면에 GDI 및 Direct3D 콘텐츠를 다시 그리는 것이 좋습니다.
  • DXGI 비트블릿 프레젠테이션 모델, 다른 버전의 Direct3D 또는 GDI를 비롯한 다른 API의 대상이 아닌 HWND 에서 대칭 이동 모델을 사용합니다. 비트블릿 모델은 표면의 추가 복사본을 유지 관리하므로 Direct3D 및 GDI의 증분 업데이트를 통해 동일한 HWND 에 GDI 및 기타 Direct3D 콘텐츠를 추가할 수 있습니다. 대칭 이동 모델을 사용하는 경우 런타임이 DWM에 전달하는 대칭 이동 모델 스왑 체인의 Direct3D 콘텐츠만 표시됩니다. 런타임은 다른 모든 비트블릿 모델 Direct3D 또는 GDI 콘텐츠 업데이트를 무시합니다.

DXGI 대칭 이동 모델 앱의 프레임 동기화

현재 통계는 미디어 앱이 비디오 및 오디오 스트림을 동기화하고 비디오 재생 결함에서 복구하는 데 사용하는 프레임 타이밍 정보입니다. 앱은 현재 통계의 프레임 타이밍 정보를 사용하여 더 원활한 프레젠테이션을 위해 비디오 프레임의 프레젠테이션 속도를 조정할 수 있습니다. 현재 통계 정보를 가져오려면 IDXGISwapChain::GetFrameStatistics 메서드를 호출하여 DXGI_FRAME_STATISTICS 구조를 가져옵니다. DXGI_FRAME_STATISTICSIDXGISwapChain1::P resent1 호출에 대한 통계를 포함합니다. 대칭 이동 모델 스왑 체인은 창 모드와 전체 화면 모드 모두에서 현재 통계 정보를 제공합니다. 창 모드의 비트blt 모델 스왑 체인의 경우 모든 DXGI_FRAME_STATISTICS 값은 0입니다.

대칭 이동 모델의 경우 IDXGISwapChain::GetFrameStatistics 는 다음과 같은 상황에서 DXGI_ERROR_FRAME_STATISTICS_DISJOINT 반환합니다.

  • 시퀀스의 시작을 나타내는 GetFrameStatistics에 대한 첫 번째 호출
  • 모드 변경: 창 모드에서 전체 화면 또는 전체 화면으로 전환

PresentRefreshCount, SyncRefreshCountDXGI_FRAME_STATISTICSSyncQPCTime 멤버의 값에는 다음과 같은 특성이 있습니다.

  • PresentRefreshCount 는 앱이 모든 vsync에 표시되면 SyncRefreshCount 와 같습니다.
  • SyncRefreshCount 는 현재가 제출되었을 때 vsync 간격으로 가져옵니다. SyncQPCTime 은 대략 vsync 간격과 연결된 시간입니다.

IDXGISwapChain::GetLastPresentCount 메서드는 스왑 체인과 연결된 디스플레이 디바이스에서 마지막으로 성공한 IDXGISwapChain1::P resent1 호출의 현재 ID인 마지막 현재 수를 반환합니다. 이 현재 ID는 DXGI_FRAME_STATISTICS 구조체의 PresentCount 멤버 값입니다. 비트블렛 모델 스왑 체인의 경우 창 모드에서는 모든 DXGI_FRAME_STATISTICS 값이 0입니다.

결함 방지, 검색 및 복구

프레임 프레젠테이션의 결함을 방지, 감지 및 복구하려면 다음 단계를 수행합니다.

  1. IDXGISwapChain1::P resent1 호출(즉, IDXGISwapChain1::P resent1 을 여러 번 호출하여 큐에서 수집됨).

  2. 제출된 모든 IDXGISwapChain1::P resent1의 현재 ID( IDXGISwapChain::GetLastPresentCount에서 반환됨) 및 연결된 계산/예상 PresentRefreshCount 값을 저장하는 present-queue 구조를 만듭니다.

  3. 결함을 감지하려면 다음을 수행합니다.

    • IDXGISwapChain::GetFrameStatistics를 호출합니다.
    • 이 프레임의 경우 운영 체제가 모니터에 마지막 이미지를 표시한 현재 ID(PresentCount) 및 vsync 수를 가져옵니다(PresentRefreshCount).
    • 현재 ID와 연결되고 이전에 현재 큐 구조에 저장한 예상 PresentRefreshCount 를 검색합니다.
    • 실제 PresentRefreshCount 가 예상 PresentRefreshCount보다 나중이면 결함이 발생했습니다.
  4. 결함에서 복구하려면 다음을 수행합니다.

    • 결함에서 복구하기 위해 건너뛸 프레임 수를 계산합니다. 예를 들어 3단계에서 현재 ID(PresentCount)에 대한 예상 vsync 수(PresentRefreshCount)가 5이고 현재 ID의 실제 vsync 수가 8인 경우 결함에서 복구하기 위해 건너뛸 프레임 수는 3프레임입니다.

    • IDXGISwapChain1::P resent1에 대한 이 호출 수의 SyncInterval 매개 변수에 0을 전달하여 이 프레임 수를 삭제하고 건너뜁니다.

      참고

      결함이 많은 프레임으로 구성된 경우 Flags 매개 변수가 DXGI_PRESENT_RESTART 설정된 IDXGISwapChain1::P resent1을 호출하여 대기 중인 모든 프레젠테이션을 취소하고 건너뜁니다.

       

다음은 프레임 프레젠테이션의 결함에서 복구하는 예제 시나리오입니다.

프레임 프레젠테이션의 결함에서 복구하는 예제 시나리오 그림

예제 시나리오에서는 프레임 A가 1의 vsync 수로 화면에 표시되도록 합니다. 하지만 실제로 프레임 A가 화면에 4로 표시되는 vsync 수를 감지합니다. 따라서 결함이 발생했음을 확인합니다. 그런 다음 3개의 프레임을 삭제할 수 있습니다. 즉, IDXGISwapChain1::P resent1에 대한 3개 호출에서 SyncInterval 매개 변수에 0을 전달할 수 있습니다. 이전 예제 시나리오에서 결함을 복구하려면 총 8 개의 IDXGISwapChain1::P resent1 호출이 필요합니다. 그러면 9번째 프레임이 예상되는 vsync 수에 따라 표시됩니다.

다음은 프레젠테이션 이벤트의 시계열입니다. 각 세로 선은 vsync를 나타냅니다. 가로 방향은 오른쪽으로 증가하는 시간입니다. 그림을 사용하여 결함이 발생할 수 있는 방법을 상상할 수 있습니다.

프레젠테이션 이벤트의 시계열 그림

그림에서는 다음 시퀀스를 보여 줍니다.

  1. 앱이 vsync에서 해제되고, 파란색으로 렌더링되고, IDXGISwapChain1::P resent1을 호출한 다음 다시 절전 모드로 돌아갑니다.

  2. GPU(그래픽 처리 장치)는 유휴 상태로 해제되고 렌더링을 파란색으로 수행한 다음 다시 절전 모드로 돌아갑니다.

  3. DWM은 다음 vsync에서 절전 모드에서 해제되고, 뒤로 버퍼에 파란색으로 구성되고, IDXGISwapChain1::P resent1을 호출한 다음 다시 절전 모드로 돌아갑니다.

  4. 앱이 절전 모드에서 해제되고 녹색으로 렌더링되고 IDXGISwapChain1::P resent1을 호출한 다음 다시 절전 모드로 돌아갑니다.

    참고

    GPU가 파란색으로 구성된 작업을 수행하는 동안 앱이 동시에 실행됩니다.

     

  5. 다음으로, GPU는 앱에 대해 녹색으로 렌더링됩니다.

  6. 마지막으로 디지털-아날로그 변환기(DAC)는 다음 vsync의 모니터에서 DWM 컴퍼지션의 결과를 표시합니다.

시간 줄에서 현재 통계의 대기 시간과 결함이 발생할 수 있는 방법을 상상할 수 있습니다. 예를 들어 화면에 나타나는 녹색에 대한 DWM 결함을 표시하려면 녹색/빨간색 상자의 오른쪽이 자주색/빨간색 상자의 오른쪽과 일치하도록 녹색/빨간색 상자를 넓힙니다. 이 시나리오에서 DAC는 파란색과 녹색 프레임의 두 프레임을 표시합니다. 이 결함은 현재 통계를 읽는 과정에서 발생한 것을 확인할 수 있습니다.

대칭 이동 모델, 더티 사각형 및 스크롤된 영역으로 프레젠테이션 향상