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를 호출하여 프레임 삭제를 감지할 수 있습니다. 실제로 다음을 수행할 수 있습니다.
- 백 버퍼에 렌더링
- Call Present
- GetPresentStats를 호출하고 결과 D3DPRESENTSTATS 구조를 저장합니다.
- 다음 프레임을 백 버퍼로 렌더링
- Call Present
- 4단계와 5단계를 한 번 이상 반복합니다.
- GetPresentStats를 호출하고 결과 D3DPRESENTSTATS 구조를 저장합니다.
- 저장된 두 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를 표시하려고 합니다.
애플리케이션 코드는 다음 시퀀스처럼 보입니다.
- 프레임 A를 백 버퍼로 렌더링
- Call Present, PresentCount = 1
- GetPresentStats를 호출하고 결과 D3DPRESENTSTATS 구조를 저장합니다.
- 다음 4개의 프레임 B, C, D, E를 각각 렌더링합니다.
- Present 4번 호출, PresentCounts = 각각 2, 3, 7, 8
- GetPresentStats를 호출하고 결과 D3DPRESENTSTATS 구조를 저장합니다.
- 저장된 두 D3DPRESENTSTATS 구조체의 PresentRefreshCount 값을 비교합니다. 차이점이 2인 경우(예: 두 GetPresentStats API 호출 간에 2개 vblank 간격이 경과한 경우) 마지막으로 제시된 프레임은 프레임 C여야 합니다. 애플리케이션은 매우 vblank 간격(모니터의 새로 고침 빈도)을 한 번 표시하기 때문에 프레임 A가 표시되는 시점과 프레임 C가 표시되는 시점 사이에 경과된 시간은 2개 vblanks여야 합니다.
- 저장된 두 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 간격 내에서 즉시 처리되며 화면에 전혀 표시되지 않음을 런타임에 나타냅니다. 다음은 이전 예제의 마지막 단계 이후의 애플리케이션 사용 예제입니다.
- 다음 프레임을 백 버퍼로 렌더링
- PresentRefreshCount에서 다음 프레임이 이미 늦었다는 것을 검색합니다.
- 프레젠테이션 간격을 D3DPRESENT_FORCEIMMEDIATE
- 다음 프레임에서 Present 호출
GetPresentStatistics의 동작은 해당 시나리오에서 변경되지 않으므로 애플리케이션은 동일한 방식으로 비디오 및 오디오 스트림을 동기화할 수 있습니다.
D3D9Ex 대칭 이동 모드는 창이 있는 애플리케이션 및 전체 화면 9Ex 애플리케이션에 프레임 통계 정보를 제공합니다.
Windows Vista: 현재 통계를 검색하는 데 DWM API를 사용합니다.
데스크톱 창 관리자가 꺼지면 대칭 이동 모드를 사용하는 창 모드 9Ex 애플리케이션은 제한된 정확도의 현재 통계 정보를 받게 됩니다.
Windows Vista:
느린 하드웨어 또는 시스템 리소스 부족으로 인해 애플리케이션이 모니터의 새로 고침 속도를 따라갈 만큼 빠르지 않으면 그래픽 결함이 발생할 수 있습니다. 결함은 소위 시각적 딸꾹질입니다. 모니터가 60Hz에서 새로 고침되도록 설정되어 있고 애플리케이션이 30fps만 관리할 수 있는 경우 프레임의 절반에 결함이 있습니다.
애플리케이션은 SynchRefreshCount를 추적하여 결함을 감지할 수 있습니다. 예를 들어 애플리케이션은 다음 일련의 작업을 수행할 수 있습니다.
- 백 버퍼로 렌더링합니다.
- Present를 호출합니다.
- GetPresentStats를 호출하고 결과 D3DPRESENTSTATS 구조를 저장합니다.
- 다음 프레임을 백 버퍼로 렌더링합니다.
- Present를 호출합니다.
- GetPresentStats를 호출하고 결과 D3DPRESENTSTATS 구조를 저장합니다.
- 저장된 두 D3DPRESENTSTATS 구조체의 SyncRefreshCount 값을 비교합니다. 차이가 1보다 크면 프레임을 건너뛰게 된 것입니다.
요구 사항
요구 사항 | 값 |
---|---|
헤더 |
|
추가 정보