summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormobserveur <mobserveur@gmail.com>2024-06-29 22:50:42 +0200
committermobserveur <mobserveur@gmail.com>2024-06-29 22:50:42 +0200
commit20b54d6c7ed671dd7a6e5b2518d338d67e81a543 (patch)
treed6afa789b38d31c84c9581fe9fa773eea7669c43
parent714038e0f35329b614d12cf467230f9cb6eea017 (diff)
Reworked fps limiter code
This improves the realiability of the fps limiter
-rw-r--r--indra/newview/llappviewer.cpp37
1 files changed, 12 insertions, 25 deletions
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 2d65c725b5..0f1b5a789b 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -393,7 +393,6 @@ static std::string gLaunchFileOnQuit;
// Used on Win32 for other apps to identify our window (eg, win_setup)
const char* const VIEWER_WINDOW_CLASSNAME = "Second Life";
-U64 fpsLimitSleepUntil = 0; // fps limiter : time until to render the frame again
//----------------------------------------------------------------------------
@@ -1373,21 +1372,11 @@ bool LLAppViewer::frame()
bool LLAppViewer::doFrame()
{
+ static LLCachedControl<U32> fpsLimitMaxFps(gSavedSettings, "MaxFPS", 0);
- // FPS Limit
-
- U64 fpsLimitNow = LLTrace::BlockTimer::getCPUClockCount64();
- U64 fpsLimitFrameStartTime = fpsLimitNow;
- if(fpsLimitSleepUntil > 0)
- {
- if(fpsLimitSleepUntil > fpsLimitNow) return 0;
- }
- else
- {
- fpsLimitSleepUntil = 0;
- }
-
-
+ U64 fpsLimitSleepFor = 0;
+ U64 fpsLimitFrameStartTime = 0;
+ if(fpsLimitMaxFps > 0) fpsLimitFrameStartTime = LLTrace::BlockTimer::getCPUClockCount64();
LL_RECORD_BLOCK_TIME(FTM_FRAME);
{
@@ -1559,24 +1548,17 @@ bool LLAppViewer::doFrame()
}
}
- // fps limiter
-
- fpsLimitNow = LLTrace::BlockTimer::getCPUClockCount64();
- U64 fpsLimitFrameTime = fpsLimitNow - fpsLimitFrameStartTime;
- static LLCachedControl<U32> fpsLimitMaxFps(gSavedSettings, "MaxFPS", 0);
-
if(fpsLimitMaxFps > 0)
{
+ U64 fpsLimitFrameTime = LLTrace::BlockTimer::getCPUClockCount64() - fpsLimitFrameStartTime;
U64 desired_time_ns = (U32)(1000000.f / fpsLimitMaxFps);
- if(fpsLimitFrameTime < desired_time_ns)
+ if((fpsLimitFrameTime+1000) < desired_time_ns)
{
- U64 fpsLimitSleepUntil_for = desired_time_ns - fpsLimitFrameTime;
- fpsLimitSleepUntil = LLTrace::BlockTimer::getCPUClockCount64() + fpsLimitSleepUntil_for;
+ fpsLimitSleepFor = (desired_time_ns - fpsLimitFrameTime - 1000) * 1.0;
}
}
-
{
LL_PROFILE_ZONE_NAMED_CATEGORY_APP( "df pauseMainloopTimeout" )
pingMainloopTimeout("Main:Sleep");
@@ -1589,6 +1571,11 @@ bool LLAppViewer::doFrame()
//LL_RECORD_BLOCK_TIME(SLEEP2);
LL_PROFILE_ZONE_WARN( "Sleep2" )
+ if(fpsLimitSleepFor)
+ {
+ usleep(fpsLimitSleepFor);
+ }
+
// yield some time to the os based on command line option
static LLCachedControl<S32> yield_time(gSavedSettings, "YieldTime", -1);
if(yield_time >= 0)