我正在创建一个在数据库中设置了中央时间戳的游戏。用户1启动游戏,时间戳被发送到数据库。两个玩家都有一个在他们的应用程序中运行的计时器,运行1个游戏时间和1个更新计时器
玩家1:
假设用户1设置的时间戳是:20:00:00
。
然后游戏一直运行到22:00:00
。
下一次更新将在20:15:00
上。 (15分钟后将再添加15分钟)
玩家2
播放器2从数据库获得完全相同的时间戳:20:00:00
播放器2还将 15分钟添加到中央时间戳。 20:15:00
游戏结束时间也是中心时间戳+2小时22:00:00
但现在问题是:
即使两个设备上的时间戳相同,定时器也至少在3-4秒后运行。当这两个定时器都定位在相同的时间戳上时,这怎么可能?定时器间隔设置为100ms。
我正在使用的代码:
玩家1:
private void InitializeTimer()
{
StartTime = CurrentGame.StartTime.Value;
EndTime = StartTime.AddMinutes(CurrentSettings.TotalGameTime); // added 120 minutes
NextUpdateTime = StartTime.AddSeconds(CurrentSettings.LocationTimePlayers); // added 15 minutes
NextUpdateTimeAdmin = StartTime.AddSeconds(CurrentSettings.LocatonTimeAdmin); // added 1 minute
GameTimer = new Timer();
GameTimer.Interval = 100;
GameTimer.Elapsed += GameTimer_Elapsed;
GameTimer.Enabled = true;
}
玩家2:
private void InitializeGameTimer()
{
StartTime = CurrentGame.StartTime.Value;
EndTime = StartTime.AddMinutes(CurrentSettings.TotalGameTime); //added 120 minutes
NextUpdateTime = StartTime.AddSeconds(CurrentSettings.LocationTimePlayers); //added 15 minutes
GameTimer = new Timer();
GameTimer.Interval = 100;
GameTimer.Elapsed += GameTimer_Elapsed;
GameTimer.Enabled = true;
}
请有人指点我的方向吗?我真的陷入了困境。
非常感谢提前。
编辑,添加了在两台设备上使用的已用事件。
public void GameTimer_Elapsed(object sender, ElapsedEventArgs e)
{
DateTime now = DateTime.Now;
if (now >= NextUpdateTime)
{
this.StartSearchingForLocationUpdates(this, null);
//Restart updatetimer(add 15 minutes again)
NextUpdateTime = NextUpdateTime.AddSeconds(CurrentSettings.LocationTimePlayers);
}
EndGameTimeSpan = EndTime.Subtract(now);// amount of gametime left, will be shown on UI
NextUpdateTimeSpan = NextUpdateTime.Subtract(now);// time till next update, will be shown on UI
this.GameTimerElapsed(sender, e);
}
答案 0 :(得分:0)
您使用的是System.Timers.Timer还是System.Windows.Forms.Timer?第一个将按时执行(或接近它,取决于时钟分辨率,你可能会关闭15毫秒左右)。第二个将按时执行,如果此时没有其他窗口消息要解析。对于游戏,你几乎肯定想要第一个。
答案 1 :(得分:0)
找到解决方案!一台设备上的当前时间在5秒后运行。所以这不是我的代码导致问题,但电话是。