在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。
我相信我犯的是一个相当愚蠢的错误,但我看不到哪里。
谢谢。
答案 0 :(得分:1)
来自doc:
GetTickCount64函数的分辨率仅限于 系统计时器的分辨率,通常在10的范围内 毫秒到16毫秒。
因此,1000 / 60~15ms,计数器分辨率不足。