我已经为一款商业PSP赛车游戏做到了这一点,该游戏既可以通过临时网络也可以通过无线热点运行。(如果需要,也可以连接到Internet上的静态服务器)
由于第2点,系统在优化方面不必太复杂
以我的经验,这是不正确的。无线设备(尤其是小型便携式设备)不像具有有线网络连接的计算机-智能手机和无线游戏机出于游戏目的往往具有较慢的网络接口。
不要误会我的意思-它们的吞吐量通常很好(即每秒的数据量;非常适合流电影或其他内容),但是特定数据包交付的延迟可能会非常糟糕,并且可能会如此高度可变,因此甚至很难估计任何单个数据包将花费多长时间。随着越来越多的无线设备的信号开始相互干扰,这种变化变得更加严重。结果,我的很多时间都花在了减少需要发送的数据包数量上,所以我们减少了数据包冲突。(请注意,在涉及有源网络热点而不是让设备直接通过ad hoc网络相互通信的情况下,这没什么大问题)
作为这种优化的一个例子,我们的赛车游戏发生在一个有交通信号灯的世界上。成千上万的。而且我们需要确保他们的信号在网络会话中的所有参与者之间都是同步的。我们没有尝试向每个人发送数据包告诉每个信号灯处于什么状态,而是为所有交通信号灯定义了一个静态时间表,然后只是确保所有客户都同意当前的“游戏时间”。由于他们都知道比赛时间,并且可以从比赛时间确定所有交通信号灯的状态,因此我们可以同步所有状态数据,而无需实际发送任何特殊数据。这一变化对我们的网络性能产生了巨大的影响。
也就是说,在多个无线设备之间建立可靠的时钟同步(由于分组丢失而导致ping时间变化很大)是一项巨大的挑战。如果您有兴趣,可以高兴地谈论更多。
每个客户都可以是有关他本人及其周围环境的权威数据来源(例如项目符号)。
这就是我们所做的,并且在我们所处的环境(汽车)中对我们来说非常有效。当然,有问题的部分是,当一个物体停止靠近玩家“ a”而不是玩家“ b”时,其所有权因此从一个玩家转移到了另一个玩家。
实际上,这是玩家之间令人惊讶的复杂协商,其中游戏“ a”建议游戏“ b”:“我认为这个物体离您更近。您应该控制它。” 然后,游戏“ b”会根据自己对情况的看法而接受或拒绝。“ a”和“ b”之间感知的游戏状态的差异,以及发送和接收请求与响应之间的时间变化,这使得获得可靠的协商特别麻烦,并且很容易退化为“热土豆”,对象所有权在多个参与者之间不断反弹。而且即使它工作正常,从游戏“ c”的有利位置来看,
我的直觉是,这种“对象所有权”方法对于子弹等短寿命的小对象可能太麻烦了。我们将其用于交通汽车和AI赛车手,它们倾向于在模拟中生存很长时间。如果您愿意信任客户,这似乎是一种更高效的方法,那就是让每个玩家的游戏拥有自己的位置和他们的投射物,并声明该玩家何时被其他人的投射物击中。(因此,作为“游戏A”,我负责说出玩家A和玩家A的弹丸在哪里,而玩家B负责说出我是否击中了玩家B)。有了一些不错的方法,您应该能够从这样的系统中获得相当合理的行为。