]> git.lizzy.rs Git - dragonfireclient.git/commitdiff
Reduce the FPS when the window is unfocused (#8837)
authorHybridDog <3192173+HybridDog@users.noreply.github.com>
Sat, 3 Oct 2020 16:33:51 +0000 (18:33 +0200)
committerGitHub <noreply@github.com>
Sat, 3 Oct 2020 16:33:51 +0000 (17:33 +0100)
builtin/settingtypes.txt
src/client/game.cpp
src/defaultsettings.cpp
src/gui/guiEngine.cpp
src/gui/guiEngine.h

index 6d9c6f573a24383df4da2cdc513f62e4e15648b6..7f2d12be5cdaf37f5a80859cdd6468c3379c23f5 100644 (file)
@@ -606,8 +606,8 @@ arm_inertia (Arm inertia) bool true
 #    to not waste CPU power for no benefit.
 fps_max (Maximum FPS) int 60 1
 
-#    Maximum FPS when game is paused.
-pause_fps_max (FPS in pause menu) int 20 1
+#    Maximum FPS when the window is not focused, or when the game is paused.
+fps_max_unfocused (FPS when unfocused or paused) int 20 1
 
 #    Open the pause menu when the window's focus is lost. Does not pause if a formspec is
 #    open.
index 920383aafd0075bcc140df19a0b443805fcdd32b..8f9d51417bb5fdd993c57f90ed6d44191b21155c 100644 (file)
@@ -3996,9 +3996,10 @@ inline void Game::limitFps(FpsControl *fps_timings, f32 *dtime)
        else
                fps_timings->busy_time = 0;
 
-       u32 frametime_min = 1000 / (g_menumgr.pausesGame()
-                       ? g_settings->getFloat("pause_fps_max")
-                       : g_settings->getFloat("fps_max"));
+       u32 frametime_min = 1000 / (
+               device->isWindowFocused() && !g_menumgr.pausesGame()
+                       ? g_settings->getFloat("fps_max")
+                       : g_settings->getFloat("fps_max_unfocused"));
 
        if (fps_timings->busy_time < frametime_min) {
                fps_timings->sleep_time = frametime_min - fps_timings->busy_time;
index 3a0b88dc21b51e3099deaa7f8ce711571b650fec..8f5ed3e173ca5b44410e350594f04148e7d52178 100644 (file)
@@ -165,7 +165,7 @@ void set_default_settings(Settings *settings)
        settings->setDefault("tooltip_show_delay", "400");
        settings->setDefault("tooltip_append_itemname", "false");
        settings->setDefault("fps_max", "60");
-       settings->setDefault("pause_fps_max", "20");
+       settings->setDefault("fps_max_unfocused", "20");
        settings->setDefault("viewing_range", "100");
 #if ENABLE_GLES
        settings->setDefault("near_plane", "0.1");
@@ -477,7 +477,7 @@ void set_default_settings(Settings *settings)
        settings->setDefault("max_block_generate_distance", "5");
        settings->setDefault("enable_3d_clouds", "false");
        settings->setDefault("fps_max", "30");
-       settings->setDefault("pause_fps_max", "10");
+       settings->setDefault("fps_max_unfocused", "10");
        settings->setDefault("max_objects_per_block", "20");
        settings->setDefault("sqlite_synchronous", "1");
        settings->setDefault("server_map_save_interval", "15");
index b40707d0165a3bf8d5fcb109d760f2ad5a4733da..4a13f0b11f570c70fa9ef810b081eea93339268a 100644 (file)
@@ -297,10 +297,14 @@ void GUIEngine::run()
 
                driver->endScene();
 
+               IrrlichtDevice *device = RenderingEngine::get_raw_device();
+               u32 frametime_min = 1000 / (device->isWindowFocused()
+                       ? g_settings->getFloat("fps_max")
+                       : g_settings->getFloat("fps_max_unfocused"));
                if (m_clouds_enabled)
-                       cloudPostProcess();
+                       cloudPostProcess(frametime_min, device);
                else
-                       sleep_ms(25);
+                       sleep_ms(frametime_min);
 
                m_script->step();
 
@@ -367,9 +371,8 @@ void GUIEngine::cloudPreProcess()
 }
 
 /******************************************************************************/
-void GUIEngine::cloudPostProcess()
+void GUIEngine::cloudPostProcess(u32 frametime_min, IrrlichtDevice *device)
 {
-       float fps_max = g_settings->getFloat("pause_fps_max");
        // Time of frame without fps limit
        u32 busytime_u32;
 
@@ -380,12 +383,10 @@ void GUIEngine::cloudPostProcess()
        else
                busytime_u32 = 0;
 
-       // FPS limiter
-       u32 frametime_min = 1000./fps_max;
-
+       // FPS limit
        if (busytime_u32 < frametime_min) {
                u32 sleeptime = frametime_min - busytime_u32;
-               RenderingEngine::get_raw_device()->sleep(sleeptime);
+               device->sleep(sleeptime);
        }
 }
 
index f9ad0fb0a90c8e8fe70a9ebbf38de3d076c37df7..e5b3edce73208a587c8f7ccd16fae6294344b88c 100644 (file)
@@ -277,7 +277,7 @@ class GUIEngine {
        /** do preprocessing for cloud subsystem */
        void cloudPreProcess();
        /** do postprocessing for cloud subsystem */
-       void cloudPostProcess();
+       void cloudPostProcess(u32 frametime_min, IrrlichtDevice *device);
 
        /** internam data required for drawing clouds */
        struct clouddata {