最佳的点对点游戏架构


10

考虑一种设置,其中游戏客户端:

  1. 拥有非常小的计算资源(移动设备,智能手机)
  2. 都连接到通用路由器(LAN,热点等)

用户想在没有外部服务器的情况下玩多人游戏。

一种解决方案是在一台电话上托管一台权威服务器,在这种情况下,它也是一个客户端。考虑到第1点,此解决方案是不可接受的,因为电话的计算资源不足。

因此,我想设计一个点对点架构,该架构将在客户端之间分配游戏的模拟负载。由于第2点,系统的优化不必太复杂;延迟将非常低。每个客户都可以是有关他本人及其周围环境的权威数据来源(例如项目符号)。

设计这种架构的最佳方法是什么?是否存在此类LAN级别对等协议的任何已知示例?

笔记:

这里解决一些问题,但是那里列出的概念对我来说太笼统了。

安全

我知道没有一台权威服务器是一个安全问题,但是在这种情况下这无关紧要,因为我愿意信任客户端。

编辑:

我忘了提:这将是一个节奏相当快的游戏(射击游戏)。

另外,我已经在Gaffer on Games上阅读了有关网络体系结构的文章

Answers:


10

看一下有关《帝国时代II》的网络体系结构的文章

他们设法创建了一款多人游戏,在配备16 MB RAM和28.8 kB / s调制解调器连接的Pentium 90上运行良好。他们通过让每个玩家运行自己的模拟来做到这一点,但是要同步他们的命令。

他们那里有一些聪明的把戏,我强烈推荐。


5

我已经为一款商业PSP赛车游戏做到了这一点,该游戏既可以通过临时网络也可以通过无线热点运行。(如果需要,也可以连接到Internet上的静态服务器)

由于第2点,系统在优化方面不必太复杂

以我的经验,这是不正确的。无线设备(尤其是小型便携式设备)不像具有有线网络连接的计算机-智能手机和无线游戏机出于游戏目的往往具有较慢的网络接口。

不要误会我的意思-它们的吞吐量通常很好(即每秒的数据量;非常适合流电影或其他内容),但是特定数据包交付的延迟可能会非常糟糕,并且可能会如此高度可变,因此甚至很难估计任何单个数据包将花费多长时间。随着越来越多的无线设备的信号开始相互干扰,这种变化变得更加严重。结果,我的很多时间都花在了减少需要发送的数据包数量上,所以我们减少了数据包冲突。(请注意,在涉及有源网络热点而不是让设备直接通过ad hoc网络相互通信的情况下,这没什么大问题)

作为这种优化的一个例子,我们的赛车游戏发生在一个有交通信号灯的世界上。成千上万的。而且我们需要确保他们的信号在网络会话中的所有参与者之间都是同步的。我们没有尝试向每个人发送数据包告诉每个信号灯处于什么状态,而是为所有交通信号灯定义了一个静态时间表,然后只是确保所有客户都同意当前的“游戏时间”。由于他们都知道比赛时间,并且可以从比赛时间确定所有交通信号灯的状态,因此我们可以同步所有状态数据,而无需实际发送任何特殊数据。这一变化对我们的网络性能产生了巨大的影响。

也就是说,在多个无线设备之间建立可靠的时钟同步(由于分组丢失而导致ping时间变化很大)是一项巨大的挑战。如果您有兴趣,可以高兴地谈论更多。

每个客户都可以是有关他本人及其周围环境的权威数据来源(例如项目符号)。

这就是我们所做的,并且在我们所处的环境(汽车)中对我们来说非常有效。当然,有问题的部分是,当一个物体停止靠近玩家“ a”而不是玩家“ b”时,其所有权因此从一个玩家转移到了另一个玩家。

实际上,这是玩家之间令人惊讶的复杂协商,其中游戏“ a”建议游戏“ b”:“我认为这个物体离您更近。您应该控制它。” 然后,游戏“ b”会根据自己对情况的看法而接受或拒绝。“ a”和“ b”之间感知的游戏状态的差异,以及发送和接收请求与响应之间的时间变化,这使得获得可靠的协商特别麻烦,并且很容易退化为“热土豆”,对象所有权在多个参与者之间不断反弹。而且即使它工作正常,从游戏“ c”的有利位置来看,

我的直觉是,这种“对象所有权”方法对于子弹等短寿命的小对象可能太麻烦了。我们将其用于交通汽车和AI赛车手,它们倾向于在模拟中生存很长时间。如果您愿意信任客户,这似乎是一种更高效的方法,那就是让每个玩家的游戏拥有自己的位置和他们的投射物,并声明该玩家何时被其他人的投射物击中。(因此,作为“游戏A”,我负责说出玩家A和玩家A的弹丸在哪里,而玩家B负责说出我是否击中了玩家B)。有了一些不错的方法,您应该能够从这样的系统中获得相当合理的行为。


1

我建议您使用锁定步骤对等体系结构。

您可以从游戏开始后计算游戏帧数开始。一个客户端渲染第一帧,然后将就绪消息发送给其他客户端,并等待从其他客户端接收就绪消息。

现在,所有客户都可以选择第二帧。渲染框架,发送和接收命令,更新世界,更新物理,然后在相互之间发送准备好的消息。

此解决方案对于LAN游戏非常有用,您的所有客户端都将保持同步。

通过这种类型的网络,您可以确保所有客户端都是同步的,因此您可以测试适合您需求的最佳方式。

第一种方法是仅将输入发送给其他人,每个客户端模拟运行,触发,碰撞检测等。第二种方法是每个客户端将有关其角色的信息发送给其他人,例如位置,旋转,状态,动画帧等,因此仅其他客户端计算它们的东西并通过网络发送它们,但第一种方法更安全。


1
这个答案似乎与游戏循环有关。我认为OP正在询问负载分配系统;具体而言,谁模仿什么,以及如何在客户端进行通信。您能否再详细一点?我也对此问题感兴趣。
Wackidev 2012年

@Wackidev使用这种类型的网络可以确保所有客户端都是同步的,因此您可以测试适合您需求的最佳方法。第一种方法是仅将输入发送给其他人,每个客户端模拟运行,触发,碰撞检测等。第二种方法是每个客户端将有关其角色的信息发送给其他人,例如位置,旋转,状态,动画帧等,因此仅其他客户端计算它们的东西并通过网络发送它们,但第一种方法更安全。
kochol 2012年

因此,请把它放在您的答案中。现在,我认为它不能回答问题。另外,请删除第一个重复的评论。谢谢。至于想法本身,您列出的第一个选项是否要求模拟具有确定性?
Wackidev 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.