D3DPRESENTSTATS 구조체

PresentEx 호출과 관련된 스왑 체인 통계를 설명합니다.

구문

typedef struct _D3DPRESENTSTATS {
  UINT          PresentCount;
  UINT          PresentRefreshCount;
  UINT          SyncRefreshCount;
  LARGE_INTEGER SyncQPCTime;
  LARGE_INTEGER SyncGPUTime;
} D3DPRESENTSTATS;

멤버

PresentCount

형식: UINT

현재 화면에 출력되는 디스플레이 디바이스에서 성공한 Present 호출의 실행 횟수입니다. 이 매개 변수는 실제로 마지막 Present 호출의 Present ID이며 반드시 전체 Present API 호출 수가 아닐 수 있습니다.

PresentRefreshCount

형식: UINT

마지막 Present가 화면에 표시된 vblank 개수이며 vblank 수는 vblank 간격마다 한 번씩 증가합니다.

SyncRefreshCount

형식: UINT

스케줄러가 QueryPerformanceCounter를 호출하여 컴퓨터 시간을 마지막으로 샘플링한 경우의 vblank 수입니다.

SyncQPCTime

형식: LARGE_INTEGER

QueryPerformanceCounter를 호출하여 얻은 스케줄러의 마지막 샘플링된 컴퓨터 시간입니다.

SyncGPUTime

형식: LARGE_INTEGER

이 값은 사용되지 않습니다.

설명

9Ex 애플리케이션이 flip Mode present(D3DSWAPEFFECT_FLIPEX)를 채택하면 애플리케이션은 언제든지 GetPresentStatistics를 호출하여 프레임 삭제를 감지할 수 있습니다. 실제로 다음을 수행할 수 있습니다.

  1. 백 버퍼에 렌더링
  2. Call Present
  3. GetPresentStats를 호출하고 결과 D3DPRESENTSTATS 구조를 저장합니다.
  4. 다음 프레임을 백 버퍼로 렌더링
  5. Call Present
  6. 4단계와 5단계를 한 번 이상 반복합니다.
  7. GetPresentStats를 호출하고 결과 D3DPRESENTSTATS 구조를 저장합니다.
  8. 저장된 두 D3DPRESENTSTATS 구조체의 PresentRefreshCount 값을 비교합니다. 애플리케이션은 PresentRefreshCount 증가 및 프레임 프레젠테이션의 PresentCount 할당을 가정하여 특정 PresentCount 매개 변수의 해당 PresentRefreshCount를 계산할 수 있습니다. 마지막으로 샘플링된 PresentRefreshCount가 PresentCount와 일치하지 않는 경우(즉, PresentRefreshCount가 증가했지만 PresentCount가 없는 경우 프레임이 삭제되었습니다.)

애플리케이션은 PresentCount 및 GetPresentStats의 두 인스턴스를 샘플링하여 프레임이 삭제되었는지 여부를 확인할 수 있습니다(두 지점에서 GetPresentStats API를 호출). 예를 들어 모니터 새로 고침 빈도와 동일한 속도로 표시되는 미디어 애플리케이션(예: 모니터 새로 고침 속도는 60Hz, 애플리케이션은 1/60초마다 프레임을 표시)은 각각 Present ID(PresentCount) 1, 2, 3, 7, 8에 해당하는 프레임 A, B, C, D, E를 표시하려고 합니다.

애플리케이션 코드는 다음 시퀀스처럼 보입니다.

  1. 프레임 A를 백 버퍼로 렌더링
  2. Call Present, PresentCount = 1
  3. GetPresentStats를 호출하고 결과 D3DPRESENTSTATS 구조를 저장합니다.
  4. 다음 4개의 프레임 B, C, D, E를 각각 렌더링합니다.
  5. Present 4번 호출, PresentCounts = 각각 2, 3, 7, 8
  6. GetPresentStats를 호출하고 결과 D3DPRESENTSTATS 구조를 저장합니다.
  7. 저장된 두 D3DPRESENTSTATS 구조체의 PresentRefreshCount 값을 비교합니다. 차이점이 2인 경우(예: 두 GetPresentStats API 호출 간에 2개 vblank 간격이 경과한 경우) 마지막으로 제시된 프레임은 프레임 C여야 합니다. 애플리케이션은 매우 vblank 간격(모니터의 새로 고침 빈도)을 한 번 표시하기 때문에 프레임 A가 표시되는 시점과 프레임 C가 표시되는 시점 사이에 경과된 시간은 2개 vblanks여야 합니다.
  8. 저장된 두 D3DPRESENTSTATS 구조체의 PresentCount 값을 비교합니다. 첫 번째 PresentCount가 1(프레임 A에 해당)이고 두 번째 PresentCount가 3(프레임 C에 해당)이면 프레임이 삭제되지 않습니다. 두 번째 PresentCount가 프레임 D에 해당하는 3이면 애플리케이션은 하나의 프레임이 삭제되었음을 알고 있습니다.

GetPresentStatistics는 FLIPEX 모드 PresentEx 호출의 상태에 관계없이 호출된 후에 처리됩니다.

Windows Vista: Present 호출은 큐에 대기한 다음 GetPresentStats 호출이 처리되기 전에 처리됩니다.

애플리케이션에서 특정 프레임의 프레젠테이션이 뒤에 있음을 감지하면 해당 프레임을 건너뛰고 프레젠테이션을 수정하여 vblank와 다시 동기화할 수 있습니다. 이를 위해 애플리케이션은 단순히 늦은 프레임을 렌더링하고 큐의 다음 올바른 프레임으로 렌더링을 시작할 수 없습니다. 그러나 애플리케이션이 이미 늦은 프레임의 렌더링을 시작한 경우 D3D9Ex에서 D3DPRESENT_FORCEIMMEDIATE 라는 새 Present 매개 변수를 사용할 수 있습니다. 플래그는 Present API 호출의 매개 변수에 전달되며, 프레임이 다음 vblank 간격 내에서 즉시 처리되며 화면에 전혀 표시되지 않음을 런타임에 나타냅니다. 다음은 이전 예제의 마지막 단계 이후의 애플리케이션 사용 예제입니다.

  1. 다음 프레임을 백 버퍼로 렌더링
  2. PresentRefreshCount에서 다음 프레임이 이미 늦었다는 것을 검색합니다.
  3. 프레젠테이션 간격을 D3DPRESENT_FORCEIMMEDIATE
  4. 다음 프레임에서 Present 호출

GetPresentStatistics의 동작은 해당 시나리오에서 변경되지 않으므로 애플리케이션은 동일한 방식으로 비디오 및 오디오 스트림을 동기화할 수 있습니다.

D3D9Ex 대칭 이동 모드는 창이 있는 애플리케이션 및 전체 화면 9Ex 애플리케이션에 프레임 통계 정보를 제공합니다.

Windows Vista: 현재 통계를 검색하는 데 DWM API를 사용합니다.

데스크톱 창 관리자가 꺼지면 대칭 이동 모드를 사용하는 창 모드 9Ex 애플리케이션은 제한된 정확도의 현재 통계 정보를 받게 됩니다.

Windows Vista:

느린 하드웨어 또는 시스템 리소스 부족으로 인해 애플리케이션이 모니터의 새로 고침 속도를 따라갈 만큼 빠르지 않으면 그래픽 결함이 발생할 수 있습니다. 결함은 소위 시각적 딸꾹질입니다. 모니터가 60Hz에서 새로 고침되도록 설정되어 있고 애플리케이션이 30fps만 관리할 수 있는 경우 프레임의 절반에 결함이 있습니다.

애플리케이션은 SynchRefreshCount를 추적하여 결함을 감지할 수 있습니다. 예를 들어 애플리케이션은 다음 일련의 작업을 수행할 수 있습니다.

  1. 백 버퍼로 렌더링합니다.
  2. Present를 호출합니다.
  3. GetPresentStats를 호출하고 결과 D3DPRESENTSTATS 구조를 저장합니다.
  4. 다음 프레임을 백 버퍼로 렌더링합니다.
  5. Present를 호출합니다.
  6. GetPresentStats를 호출하고 결과 D3DPRESENTSTATS 구조를 저장합니다.
  7. 저장된 두 D3DPRESENTSTATS 구조체의 SyncRefreshCount 값을 비교합니다. 차이가 1보다 크면 프레임을 건너뛰게 된 것입니다.

요구 사항

요구 사항
헤더
D3d9types.h

추가 정보

Direct3D 구조체