通用Windows平台Direct3D C ++应用程序上的60 FPS游戏循环

时间:2016-01-07 21:16:24

标签: c++ uwp directx-11 frame-rate game-loop

在Windows的C ++方面相当新 - 特殊的非Win32,如UWP -

我试图通过每1000/60毫秒简单地勾选(更新/渲染)来将FPS限制在稳定的60 FPS。我面临一个奇怪的情况。如果我使用Present(0,0),交换链将自动锁定和v-sync,一切都很好。如果我使用Present1(0,DXGI_PRESENT_DO_NOT_WAIT,& params)......我达到600 FPS ......

现在,在让FPS免费(600)的同时,我想实现自己的自动收报机。到目前为止,我有:

bool Ticker::Tick() {

    long currentTick = GetTickCount64();
    long deltaTicks = (currentTick - gLastTick);
    bool tick = false;

    // determine whether it is tick time
    if (deltaTicks >= gUpdateTime) {
        gLastTick = currentTick;
        gTicksCount++;
        char buf[256];
        sprintf_s(buf, "Current delta: %30d\n", deltaTicks);
        OutputDebugStringA(buf);
        tick = true;
    }

    // this metric must happen regardless of actual true Ticks
    if (currentTick - gSecondTime >= 1000) {
        gCurrentFrameRate = gTicksCount;
        gSecondTime = currentTick;
        OutputDebugStringW(L"Second is up\n");
        gTicksCount = 0;
    }

    return tick;
}

毋庸置疑这不起作用......当我的目标刷新非常1000/60时,我正在达到20/21 FPS。

我相信我犯的是一个相当愚蠢的错误,但我看不到哪里。

谢谢。

1 个答案:

答案 0 :(得分:1)

来自doc:

  

GetTickCount64函数的分辨率仅限于   系统计时器的分辨率,通常在10的范围内   毫秒到16毫秒。

因此,1000 / 60~15ms,计数器分辨率不足。