编写实时多人游戏的最佳方式

Eri*_*ken 1 real-time

我不确定实时这个术语是否被滥用,但是这个想法是服务器上的许多玩家都有一个城市每秒产生n个资源.可能有一千个这样的城市.奖励所有玩家城市的最佳方式是什么?

当游戏"活着"时,这样的循环最好的方式是在无限循环中运行吗?(请用这种简单的逻辑忽略明显的错误)

foreach(City c in AllCities){
  if(c.lastTouched < DateTime.Now.AddSeconds(-10)){
    c.resources += (DateTime.Now-c.lastTouched).Seconds * c.resourcesPerSecond;
    c.lastTouched = DateTime.Now;
    c.saveChanges();
  }
}
Run Code Online (Sandbox Code Playgroud)

Guy*_*ton 5

我不认为你想要一个无限循环,因为这会浪费很多CPU周期.这基本上是维基百科模拟软件的常见模拟情况,我可以想到几种方法:

  1. 离散时间方法,您可以将时钟递增固定时间并重新计算系统状态.这类似于上面的方法,除了定期计算并删除10秒if子句.
  2. 一种离散事件方法,其中您有一个中央事件队列,每个队列都有一个按时间排序的时间戳.你睡觉直到下一个事件到期,然后发送它.例如,该事件可能意味着添加单个资源. 维基百科离散事件模拟
  3. 每当有人要求资源数量时,都会根据费率,初始时间和当前时间计算出来.当预计查询数量相对于城市数量和经过的时间较小时,这可能非常有效.