довольно новое на стороне C ++ окон — специальные не Win32, такие как UWP —
Я пытаюсь ограничить FPS с постоянными 60 FPS, просто отмечая галочкой (Update / Render) каждые 1000/60 миллисекунд. Я сталкиваюсь со странной ситуацией, хотя. Если я использую Present (0,0), цепочка подкачки будет автоматически блокироваться и выполнять v-синхронизацию, все хорошо. Если я использую Present1 (0, DXGI_PRESENT_DO_NOT_WAIT, ¶ms) … я набрал 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;
}
Излишне говорить, что это не работает … Я бью 20/21 FPS, когда моя цель — обновление очень 1000/60.
Я полагаю, что совершаю довольно глупую ошибку, но я не вижу, где.
Спасибо.
Из документа:
Разрешение функции GetTickCount64 ограничено
разрешение системного таймера, которое обычно находится в диапазоне 10
от миллисекунд до 16 миллисекунд.
Так что при 1000/60 ~ 15 мс разрешение счетчика неадекватно.
Других решений пока нет …