瀏覽代碼

Use precision clocks for timer

nordsoft 2 年之前
父節點
當前提交
2c61d1b23f
共有 2 個文件被更改,包括 11 次插入6 次删除
  1. 8 3
      server/CGameHandler.cpp
  2. 3 3
      server/TurnTimerHandler.cpp

+ 8 - 3
server/CGameHandler.cpp

@@ -999,18 +999,23 @@ void CGameHandler::run(bool resume)
 	turnOrder->onGameStarted();
 
 	//wait till game is done
+	auto clockLast = std::chrono::high_resolution_clock::now();
 	while(lobby->getState() == EServerState::GAMEPLAY)
 	{
+		const auto clockDuration = std::chrono::high_resolution_clock::now() - clockLast;
+		const int timePassed = std::chrono::duration_cast<std::chrono::milliseconds>(clockDuration).count();
+		clockLast += clockDuration;
+
 		const int waitTime = 100; //ms
 
 		for(PlayerColor player(0); player < PlayerColor::PLAYER_LIMIT; ++player)
 			if(gs->isPlayerMakingTurn(player))
-				turnTimerHandler.onPlayerMakingTurn(player, waitTime);
+				turnTimerHandler.onPlayerMakingTurn(player, timePassed);
 
 		if(gs->curB)
-			turnTimerHandler.onBattleLoop(waitTime);
+			turnTimerHandler.onBattleLoop(timePassed);
 
-		boost::this_thread::sleep_for(boost::chrono::milliseconds(waitTime));
+		boost::this_thread::sleep_for(boost::chrono::milliseconds(100));
 	}
 }
 

+ 3 - 3
server/TurnTimerHandler.cpp

@@ -72,7 +72,7 @@ void TurnTimerHandler::onPlayerMakingTurn(PlayerColor player, int waitTime)
 			int frequency = (timers[player].turnTimer > turnTimePropagateThreshold ? turnTimePropagateFrequency : turnTimePropagateFrequencyCrit);
 			
 			if(state.status == EPlayerStatus::INGAME //do not send message if player is not active already
-			   && timers[player].turnTimer % frequency == 0)
+			   && timers[player].turnTimer / 100 * 100 % frequency == 0)
 			{
 				TurnTimeUpdate ttu;
 				ttu.player = state.color;
@@ -132,7 +132,7 @@ void TurnTimerHandler::onBattleNextStack(const CStack & stack)
 	if(!player.isValidPlayer())
 		return;
 		
-	if(timers[player].battleTimer < si->turnTimerInfo.battleTimer)
+	if(timers[player].battleTimer == 0)
 		timers[player].battleTimer = timers[player].creatureTimer;
 	timers[player].creatureTimer = si->turnTimerInfo.creatureTimer;
 		
@@ -177,7 +177,7 @@ void TurnTimerHandler::onBattleLoop(int waitTime)
 			? turnTimePropagateFrequency : turnTimePropagateFrequencyCrit;
 			
 			if(state.status == EPlayerStatus::INGAME //do not send message if player is not active already
-			   && tTimer.creatureTimer % frequency == 0)
+			   && (tTimer.creatureTimer / 100 * 100 % frequency) == 0)
 			{
 				TurnTimeUpdate ttu;
 				ttu.player = state.color;