2
0
Эх сурвалжийг харах

Fix freezing of hero and long enemy turns without sleeping in FramerateManager::framerateDelay()

Alexander Wilms 2 жил өмнө
parent
commit
f52562eeb7

+ 1 - 2
client/gui/CGuiHandler.cpp

@@ -129,11 +129,10 @@ void CGuiHandler::renderFrame()
 
 		CCS->curh->render();
 
-		SDL_RenderPresent(mainRenderer);
-
 		windows().onFrameRendered();
 	}
 
+	SDL_RenderPresent(mainRenderer);
 	framerate().framerateDelay(); // holds a constant FPS
 }
 

+ 11 - 16
client/gui/FramerateManager.cpp

@@ -15,22 +15,12 @@
 #include <SDL_video.h>
 
 FramerateManager::FramerateManager(int targetFrameRate)
-	: lastFrameIndex(0)
+	: targetFrameTime(Duration(boost::chrono::seconds(1)) / targetFrameRate)
+	, lastFrameIndex(0)
 	, lastFrameTimes({})
 	, lastTimePoint(Clock::now())
+	, vsyncEnabled(settings["video"]["vsync"].Bool())
 {
-	if(settings["video"]["vsync"].Bool())
-	{
-		static int display_in_use = settings["video"]["displayIndex"].Integer();
-		SDL_DisplayMode mode;
-		SDL_GetCurrentDisplayMode(display_in_use, &mode);
-		int displayRefreshRate = mode.refresh_rate;
-		logGlobal->info("Display refresh rate is %d", displayRefreshRate);
-		targetFrameTime = Duration(boost::chrono::seconds(1)) / displayRefreshRate;
-	} else
-	{
-		targetFrameTime = Duration(boost::chrono::seconds(1)) / targetFrameRate;
-	}
 	boost::range::fill(lastFrameTimes, targetFrameTime);
 }
 
@@ -38,9 +28,14 @@ void FramerateManager::framerateDelay()
 {
 	Duration timeSpentBusy = Clock::now() - lastTimePoint;
 
-	// FPS is higher than it should be, then wait some time
-	if(timeSpentBusy < targetFrameTime)
-		boost::this_thread::sleep_for(targetFrameTime - timeSpentBusy);
+	if(!vsyncEnabled)
+	{
+		// if FPS is higher than it should be, then wait some time
+		if(timeSpentBusy < targetFrameTime)
+		{
+			boost::this_thread::sleep_for(targetFrameTime - timeSpentBusy);
+		}
+	}
 
 	// compute actual timeElapsed taking into account actual sleep interval
 	// limit it to 100 ms to avoid breaking animation in case of huge lag (e.g. triggered breakpoint)

+ 2 - 0
client/gui/FramerateManager.h

@@ -25,6 +25,8 @@ class FramerateManager
 	/// index of last measured frome in lastFrameTimes array
 	ui32 lastFrameIndex;
 
+	bool vsyncEnabled;
+
 public:
 	FramerateManager(int targetFramerate);