Add FPS limit to menu clouds
authorShadowNinja <noreply@gmail.com>
Sun, 17 Mar 2013 15:53:04 +0000 (11:53 -0400)
committerkwolekr <kwolekr@minetest.net>
Sun, 17 Mar 2013 16:13:48 +0000 (12:13 -0400)
src/main.cpp

index e5aa3017d8b4b59908d511dbd584fc55d48e13d1..e4dbb8a546349c2d9d73f3e97559bc4e04e06ea0 100644 (file)
@@ -1597,7 +1597,7 @@ int main(int argc, char *argv[])
                                if(skip_main_menu == false)
                                {
                                        video::IVideoDriver* driver = device->getVideoDriver();
-                                       
+                                       float fps_max = g_settings->getFloat("fps_max");
                                        infostream<<"Waiting for other menus"<<std::endl;
                                        while(device->run() && kill == false)
                                        {
@@ -1690,8 +1690,28 @@ int main(int argc, char *argv[])
                                                
                                                // On some computers framerate doesn't seem to be
                                                // automatically limited
-                                               if (!cloud_menu_background)
+                                               if (cloud_menu_background) {
+                                                       // Time of frame without fps limit
+                                                       float busytime;
+                                                       u32 busytime_u32;
+                                                       // not using getRealTime is necessary for wine
+                                                       u32 time = device->getTimer()->getTime();
+                                                       if(time > lasttime)
+                                                               busytime_u32 = time - lasttime;
+                                                       else
+                                                               busytime_u32 = 0;
+                                                       busytime = busytime_u32 / 1000.0;
+
+                                                       // FPS limiter
+                                                       u32 frametime_min = 1000./fps_max;
+                       
+                                                       if(busytime_u32 < frametime_min) {
+                                                               u32 sleeptime = frametime_min - busytime_u32;
+                                                               device->sleep(sleeptime);
+                                                       }
+                                               } else {
                                                        sleep_ms(25);
+                                               }
                                        }
                                        
                                        infostream<<"Dropping main menu"<<std::endl;