UWP — 60 FPS Game Loop на универсальной платформе Windows Direct3D C ++ App

довольно новое на стороне C ++ окон — специальные не Win32, такие как UWP —

Я пытаюсь ограничить FPS с постоянными 60 FPS, просто отмечая галочкой (Update / Render) каждые 1000/60 миллисекунд. Я сталкиваюсь со странной ситуацией, хотя. Если я использую Present (0,0), цепочка подкачки будет автоматически блокироваться и выполнять v-синхронизацию, все хорошо. Если я использую 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;
}

Излишне говорить, что это не работает … Я бью 20/21 FPS, когда моя цель — обновление очень 1000/60.

Я полагаю, что совершаю довольно глупую ошибку, но я не вижу, где.

Спасибо.

0

Решение

Из документа:

Разрешение функции GetTickCount64 ограничено
разрешение системного таймера, которое обычно находится в диапазоне 10
от миллисекунд до 16 миллисекунд.

Так что при 1000/60 ~ 15 мс разрешение счетчика неадекватно.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]