2014-12-19 10 views
1

저는 D3D 앱에서 고정 60fps를 달성하고 vsync를 사용하여이를 수행하려고합니다. I는 다음과 같이 설정 루프를했습니다 :DirectX VSYNC 부정확

while(isRunning) 
      { 
       ProcessMessages(window); 

       renderer->context->ClearRenderTargetView(renderer->renderTarget, color); 
       renderer->swapChain->Present(1, 0); 

       end = GetCurrentTick(); 
       double ms = GetElapsedMilliseconds(start, end); 
       start = end; 
      } 

// Function definitions 

inline LONGLONG GetCurrentTick() 
{ 
    LARGE_INTEGER count; 
    QueryPerformanceCounter(&count); 
    return count.QuadPart; 
} 

inline double GetElapsedMilliseconds(LONGLONG start, LONGLONG end) 
{ 
    return (1000.0 * (double)(end - start))/(double)freq.QuadPart; 
} 

내가 "MS는"변수는 항상 동일하게 볼 기대하지만, 실제로 17 이상 뭔가 약 16.1 MS에서 변화하는 것 몇 가지 잘못된 가정이 있는가 I m 코딩을하거나 그냥 코딩 오류가 있습니까? 도움에 미리 감사드립니다.

답변

0

빈 루프 타이밍은 특히 정확하지 않으며 쉽게 혼동 될 수 있으므로 대신 실제 장면이있는 무언가를 만들어야합니다. 그런 다음 GPUView 또는 유사한 도구를 사용하여 코드의 스톨을 파악할 수 있습니다.

여기서 일어나는 일은 Windows에서 3 개의 프레임을 큐에 넣은 다음 스레드가 처리되고 다시 준비 될 때까지 스레드를 잠자기 상태로 놓습니다. 기본 스케쥴러 퀀텀은 15ms이므로, 현재 대기열에 의해 기본적으로 유지되는이 안정된 상태에있게되면 많은 지연이 발생합니다.

DXGI_PRESENT_DO_NOT_WAIT을 현재 사용하면 코드에서이 동작을 감지 할 수 있습니다.이 경우 스레드를 잠자기 상태로 설정하는 대신 오류 코드 DXGI_ERROR_WAS_STILL_DRAWING이 반환됩니다.

또한 어떤 플립 모델을 사용하고 있는지 언급하지 않았습니다.

+0

DXGI_SWAP_EFFECT_DISCARD를 사용하고 있습니다. – user1760770