From 2cac416000d18a108776289d94ed878b92a2391c Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Sat, 12 Feb 2022 13:46:36 +0000 Subject: [PATCH] vblankmanager: When calculating fps limiter sleep time, take the min of the rolling max frame time against target interval - redzone We account for redzone later, and don't want to go over vblank time and preceed into previous vblank or whatever here. --- src/vblankmanager.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vblankmanager.cpp b/src/vblankmanager.cpp index 6265c6b..d5fb7c2 100644 --- a/src/vblankmanager.cpp +++ b/src/vblankmanager.cpp @@ -275,10 +275,12 @@ void fpslimitThreadRun( void ) int64_t sleepyTime = targetInterval; if ( refresh % nTargetFPS == 0 ) { - sleepyTime -= rollingMaxFrameTime; + // Take the min of it to the target interval - the fps limiter redzone + // so that we don't go over the target interval - expected vblank time + sleepyTime -= std::min( rollingMaxFrameTime, targetInterval - g_uFPSLimiterRedZoneNS ); + sleepyTime -= g_uFPSLimiterRedZoneNS; sleepyTime -= g_uRollingMaxDrawTime.load(); sleepyTime -= g_uVblankDrawBufferRedZoneNS; - sleepyTime -= g_uFPSLimiterRedZoneNS; vblank = g_lastVblank; while ( vblank < t1 )