Parcourir la source

+ Added FPS capping option for laptops
~ Changed default FPS cap to 30 FPS
~ Fixed bug where the windowed mode wasn't rendering anything

Signed-off-by: Alexis Maiquez <almamu@almamu.com>

Alexis Maiquez il y a 7 ans
Parent
commit
ec29beca90
2 fichiers modifiés avec 30 ajouts et 12 suppressions
  1. 6 0
      README.md
  2. 24 12
      main.cpp

+ 6 - 0
README.md

@@ -78,6 +78,12 @@ Only screens configured with the XRandr extension are supported. To specify the
 
 
 **IMPORTANT: Right now this doesn't work if there is anything drawing to the background (like a compositor, nautilus, etc)**
 **IMPORTANT: Right now this doesn't work if there is anything drawing to the background (like a compositor, nautilus, etc)**
 
 
+#### 5.4.4. Limiting FPS
+To reduce the performance hit to your system you can reduce (or increase) the FPS limit with the switch ```--fps```, specially useful for laptops:
+```
+./wallengine --fps 30
+```
+
 ###### Example background
 ###### Example background
 This was the first background to even be compatible with the software. And It's not 100% compatible yet. Both textures and shaders are properly loaded, but there are still particles missing.
 This was the first background to even be compatible with the software. And It's not 100% compatible yet. Both textures and shaders are properly loaded, but there are still particles missing.
 
 

+ 24 - 12
main.cpp

@@ -152,7 +152,8 @@ void print_help (const char* route)
         << "  --silent\t\tMutes all the sound the wallpaper might produce" << std::endl
         << "  --silent\t\tMutes all the sound the wallpaper might produce" << std::endl
         << "  --dir <folder>\tLoads an uncompressed background from the given <folder>" << std::endl
         << "  --dir <folder>\tLoads an uncompressed background from the given <folder>" << std::endl
         << "  --pkg <folder>\tLoads a scene.pkg file from the given <folder>" << std::endl
         << "  --pkg <folder>\tLoads a scene.pkg file from the given <folder>" << std::endl
-        << "  --screen-root <screen name>\tDisplay as screen's background" << std::endl;
+        << "  --screen-root <screen name>\tDisplay as screen's background" << std::endl
+        << "  --fps <maximum-fps>\tLimits the FPS to the given number, useful to keep battery consumption low" << std::endl;
 }
 }
 
 
 std::string stringPathFixes(const std::string& s){
 std::string stringPathFixes(const std::string& s){
@@ -171,6 +172,7 @@ std::string stringPathFixes(const std::string& s){
 int main (int argc, char* argv[])
 int main (int argc, char* argv[])
 {
 {
     int mode = 0;
     int mode = 0;
+    int max_fps = 30;
     bool audio_support = true;
     bool audio_support = true;
     std::string path;
     std::string path;
 
 
@@ -180,9 +182,10 @@ int main (int argc, char* argv[])
             {"screen-root", required_argument, 0, 'r'},
             {"screen-root", required_argument, 0, 'r'},
             {"pkg",         required_argument, 0, 'p'},
             {"pkg",         required_argument, 0, 'p'},
             {"dir",         required_argument, 0, 'd'},
             {"dir",         required_argument, 0, 'd'},
-            {"silent",      optional_argument, 0, 's'},
-            {"help",        optional_argument, 0, 'h'},
-            {nullptr,                   0, 0,   0}
+            {"silent",      no_argument,       0, 's'},
+            {"help",        no_argument,       0, 'h'},
+            {"fps",         required_argument, 0, 'f'},
+            {nullptr,              0, 0,   0}
     };
     };
 
 
     while (true)
     while (true)
@@ -217,6 +220,10 @@ int main (int argc, char* argv[])
                 print_help (argv [0]);
                 print_help (argv [0]);
                 return 0;
                 return 0;
 
 
+            case 'f':
+                max_fps = atoi (optarg);
+                break;
+
             default:
             default:
                 break;
                 break;
         }
         }
@@ -292,18 +299,21 @@ int main (int argc, char* argv[])
     // register nodes
     // register nodes
     wp::video::renderer::queueNode (wp_project->getScene ());
     wp::video::renderer::queueNode (wp_project->getScene ());
 
 
-    int32_t lastTime = 0;
-    int32_t minimumTime = 1000 / 90;
-    int32_t currentTime = 0;
+    irr::u32 lastTime = 0;
+    irr::u32 minimumTime = 1000 / max_fps;
+    irr::u32 currentTime = 0;
+
+    irr::u32 startTime = 0;
+    irr::u32 endTime = 0;
 
 
     while (wp::irrlicht::device->run () && wp::irrlicht::driver)
     while (wp::irrlicht::device->run () && wp::irrlicht::driver)
     {
     {
         // if (device->isWindowActive ())
         // if (device->isWindowActive ())
         {
         {
-            currentTime = wp::irrlicht::device->getTimer ()->getTime ();
+            currentTime = startTime = wp::irrlicht::device->getTimer ()->getTime ();
             g_Time = currentTime / 1000.0f;
             g_Time = currentTime / 1000.0f;
 
 
-            if (currentTime - lastTime > minimumTime)
+            if (Viewports.size () > 0)
             {
             {
                 std::vector<irr::core::rect<irr::s32>>::iterator cur = Viewports.begin ();
                 std::vector<irr::core::rect<irr::s32>>::iterator cur = Viewports.begin ();
                 std::vector<irr::core::rect<irr::s32>>::iterator end = Viewports.end ();
                 std::vector<irr::core::rect<irr::s32>>::iterator end = Viewports.end ();
@@ -314,13 +324,15 @@ int main (int argc, char* argv[])
                     wp::irrlicht::driver->setViewPort (*cur);
                     wp::irrlicht::driver->setViewPort (*cur);
                     wp::video::renderer::render ();
                     wp::video::renderer::render ();
                 }
                 }
-
-                lastTime = currentTime;
             }
             }
             else
             else
             {
             {
-                wp::irrlicht::device->sleep (1, false);
+                wp::video::renderer::render ();
             }
             }
+
+            endTime = wp::irrlicht::device->getTimer ()->getTime ();
+
+            wp::irrlicht::device->sleep (minimumTime - (endTime - startTime), false);
         }
         }
     }
     }