diff options
| author | mobserveur <mobserveur@gmail.com> | 2024-06-29 22:50:42 +0200 | 
|---|---|---|
| committer | mobserveur <mobserveur@gmail.com> | 2024-06-29 22:50:42 +0200 | 
| commit | 20b54d6c7ed671dd7a6e5b2518d338d67e81a543 (patch) | |
| tree | d6afa789b38d31c84c9581fe9fa773eea7669c43 | |
| parent | 714038e0f35329b614d12cf467230f9cb6eea017 (diff) | |
Reworked fps limiter code
This improves the realiability of the fps limiter
| -rw-r--r-- | indra/newview/llappviewer.cpp | 37 | 
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) | 
