summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authormobserveur <mobserveur@gmail.com>2024-06-15 14:43:01 +0200
committermobserveur <mobserveur@gmail.com>2024-06-15 14:43:01 +0200
commit4f4ad7dfcaeefd8bdaa59da57e54f9a30e04ad9e (patch)
tree0c0feb93d641250fc677b841708d82cd88fa3287 /indra
parent8c527302b9724195d3ee7390856462922e9aaa80 (diff)
added fps limiter
added an fps limiter, set by the MaxFPS debug setting
Diffstat (limited to 'indra')
-rw-r--r--indra/newview/llappviewer.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index b3c2f3c108..326ffa917a 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -389,6 +389,8 @@ 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
+
//----------------------------------------------------------------------------
// List of entries from strings.xml to always replace
@@ -1363,6 +1365,22 @@ bool LLAppViewer::frame()
bool LLAppViewer::doFrame()
{
+
+ // FPS Limit
+
+ U64 fpsLimitNow = LLTrace::BlockTimer::getCPUClockCount64();
+ U64 fpsLimitFrameStartTime = fpsLimitNow;
+ if(fpsLimitSleepUntil > 0)
+ {
+ if(fpsLimitSleepUntil > fpsLimitNow) return 0;
+ }
+ else
+ {
+ fpsLimitSleepUntil = 0;
+ }
+
+
+
LL_RECORD_BLOCK_TIME(FTM_FRAME);
{
// and now adjust the visuals from previous frame.
@@ -1533,6 +1551,24 @@ bool LLAppViewer::doFrame()
}
}
+ // fps limiter
+
+ fpsLimitNow = LLTrace::BlockTimer::getCPUClockCount64();
+ U64 fpsLimitFrameTime = fpsLimitNow - fpsLimitFrameStartTime;
+ static LLCachedControl<U32> fpsLimitMaxFps(gSavedSettings, "MaxFPS", 0);
+
+ if(fpsLimitMaxFps > 0)
+ {
+ U64 desired_time_ns = (U32)(1000000.f / fpsLimitMaxFps);
+
+ if(fpsLimitFrameTime < desired_time_ns)
+ {
+ U64 fpsLimitSleepUntil_for = desired_time_ns - fpsLimitFrameTime;
+ fpsLimitSleepUntil = LLTrace::BlockTimer::getCPUClockCount64() + fpsLimitSleepUntil_for;
+ }
+ }
+
+
{
LL_PROFILE_ZONE_NAMED_CATEGORY_APP( "df pauseMainloopTimeout" )
pingMainloopTimeout("Main:Sleep");