Developer knowledge network · moderated exchange

Супольнасць UnreliableCode

Супольнасць распрацоўшчыкаў даследаванняў, зваротнага праектавання і кадавання

Knowledge indexжыць
4Categories
919Threads
2.8KПаведамленні
Guide

High-Precision Frame Limiter using QueryPerformanceCounter in C++

imgui_artisan
UI Designer
MEMBER
прадстаўнік: 202
Дата далучэння: Apr 2019
Паведамленні: 54
Дзякуй: 28
3 тыдняў таму · Jul 27, 2026 2:14 PM
#1

Standard Sleep(1) in Win32 has a resolution of 1-15ms which causes jittery 144Hz overlay rendering.

Hybrid Precision Frame Limiter:

CPP
void LimitFrameRate(double targetFps) {
    static LARGE_INTEGER freq, lastTime;
    static bool init = false;
    if (!init) { QueryPerformanceFrequency(&freq); QueryPerformanceCounter(&lastTime); init = true; }
    
    double targetDelta = 1.0 / targetFps;
    LARGE_INTEGER currentTime;
    QueryPerformanceCounter(&currentTime);
    
    double elapsed = (double)(currentTime.QuadPart - lastTime.QuadPart) / freq.QuadPart;
    while (elapsed < targetDelta) {
        if (targetDelta - elapsed > 0.002) {
            Sleep(1); // Coarse sleep to yield CPU
        } else {
            YieldProcessor(); // Fine spinwait for last 2ms
        }
        QueryPerformanceCounter(&currentTime);
        elapsed = (double)(currentTime.QuadPart - lastTime.QuadPart) / freq.QuadPart;
    }
    lastTime = currentTime;
}

Delivers rock-solid 144.00 FPS with 0.05ms frame-time variance!

matrix_math_guy
Math Specialist
MEMBER
прадстаўнік: 105
Дата далучэння: Aug 2018
Паведамленні: 52
Дзякуй: 41
3 тыдняў таму · Jul 27, 2026 4:32 PM
#2

The hybrid Sleep(1) + YieldProcessor() approach keeps CPU usage at 0.5% while delivering sub-millisecond frame pacing.

dx12_render_dev
DX12 Master
MEMBER
прадстаўнік: 55
Дата далучэння: Oct 2020
Паведамленні: 9
Дзякуй: 65
3 тыдняў таму · Jul 28, 2026 12:59 AM
#3

Frame time graph in ImGui is a flat horizontal line with this.