2011-10-05 2 views
2

저는 Direct3D9에서 초보자이며 약간의 시도를하고 있습니다. 'WaitForVSync'를 'IDirect3DDevice9Ex'장치에 사용하고 싶습니다. 그러나, 나는 그것을 사용하고 VSYNC 인터럽트를 얻는 방법을 모른다. MSDN이나 코드 스 니펫에서 많은 도움을 얻을 수 없습니다. 어떤 도움을 주시면 감사하겠습니다.어떻게하면 'WaitForVBlank'를 사용하여 Direct3d9에서 VSYNC 인터럽트를 얻을 수 있습니까?

감사합니다, 태그 Mots

+0

D3D9Ex ... 이것은 Windows 7 이상에서만 사용 가능한 API입니다. 이 함수는 이미 호출 스레드를 잠자기 상태로 만들고 다음 번 VBlank 인터럽트가 발생할 때 D3D 런타임이 이벤트를 알리기를 기다립니다. 런타임은 스레드가 그래픽 관련 이벤트를 기다리고 있기 때문에 멀티미디어 클래스 스케줄링을 처리 할 수 ​​있습니다. –

답변

0

1) 디스플레이를 확인하려는 경우가 만 VSYNC가 발생하면, 다음 D3DPRESENT_INTERVAL_DEFAULT 또는 D3DPRESENT_INTERVAL_ONE을 사용하여 표시됩니다. 프리젠 테이션 (와 VSYNC)가 아직있는 경우) (현재는 수직 동기화를 기다리는 동안 당신이 어떤 처리를 수행하려는 경우

2), 당신은 IDirect3DSwapChain9 :: 현재와 D3DPRESENT_DONOTWAIT 플래그를 사용할 수 있습니다,이 D3DERR_WASSTILLDRAWING를 반환합니다 촬영 장소. IDirect3DDevice9 :: GetSwapChain을 호출 해, 디폴트 스왑 체인을 취득 할 수있다.

3) IDirect3DDevice9 :: GetRasterStatus를 사용하여 래스터 (스캔 라인)가 수직 동기화 영역에 있는지 여부를 확인할 수도 있습니다. 드라이버 및 하드웨어 지원이 필요하다면 D3DCAPS_READ_SCANLINE에 대한 D3DCAPS9.Caps를 확인하여 지원 여부를 결정할 수 있습니다. 내가 아는 모든 최신 그래픽 하드웨어는 그 모자를 드러내지 만, 사용되는 모니터/TV의 나이/유형에 의존 할 수도 있습니다. 이 코드는 당신이 수직 공백 기간 동안 (당신의 인터럽트를 수행 할 작업) 함수를 호출 할 수 http://www.gamedev.net/topic/319407-wait-for-vsync/

+0

고마워요 Robinson. 이전에 링크를 읽었습니다. 그러나, 나는 특히 내 코드에서 'WaitForVBlank'를 사용하는 방법을 찾고있다. –

1

:에서

Cribbed. 나는 타이밍 문제 때문에 이것을 추천하지 않을 것이다. 당신이 수직 공백 기간에 있다고 생각할 때쯤에는 끝날 수도 있습니다. 타겟 하드웨어를 알고 있다면 이것을 고려해 볼 수 있지만, 실험적으로 함수 호출의 대기 시간을 계산해야합니다. VSYNC 콜백을 사용하지 않는 것이 좋습니다. 어쨌든 그것을하는 코드는 다음과 같습니다.

D3DRASTER_STATUS rStatus; 
pd3dDevice->GetRasterStatus(0, &rStatus); 

while (rStatus.InVBlank) 
{ 
    Sleep(0); // Ensure other threads get CPU time. 
    pd3dDevice->GetRasterStatus(0, &rStatus); 
} 

// Should be in a vertical blank period. Call your function here. 
MyFunction(); 
+0

와우,'Sleep (0)'을 사용하여 다른 스레드가 CPU 시간을 확보하지 못하게하십시오. 이것은 아무 것도하지 않을 것입니다. 렌더 스레드는 이미 대기중인 스레드보다 우선 순위가 높습니다. 스레드가 대기 목록하지만 즉시 다시 CPU의 포획을 취하고 당신은 아무것도 달성하지 않습니다. 대신에'YieldProcessor' 또는'SwitchToThread'를 고려하십시오. –

관련 문제