networking傍克隆

我有TCP套接字,UDP通信等基础知识,但是找不到如何将这些应用到实时游戏环境。

我有一个Pong克隆,有4个玩家,需要在三个客户端和服务器之间同步桨的位置(服务器是第四个玩家)。 目前,我使用UDP发送实时更新(桨运动),TCP建立游戏大厅等。

发送大量的UDPstream量是否是一件坏事? 我应该看看DCCP的拥塞特性吗? 或者这是不是像这样的小规模项目真的是一个问题?

什么时候应该同步消息在客户端/服务器之间发送? 目前,服务器正在尽可能快地使用当前游戏状态垃圾邮件发送UDP数据包,并且客户端正在尽可能快地将自己的pad位置发送回服务器。 这是做这件事的最好方法吗? 是否有某种延迟,我应该添加,所以消息每X毫秒发送一次,或者我应该只发送消息事件发生? (例如由于用户input而改变桨叶速度)

让客户与对方点对点交stream他们的桨位置会更好吗?

我在Pong的背景下提出了这些问题,但是我也对这些问题在其他游戏中如何被克服,或者一般化的解决scheme感兴趣。

有一个可configuration的更新间隔(所以你可以调整和尝试每秒5包或20),每帧看看是否是时候发送更新。 对于每个事件发送数据包的简单游戏,你可能没问题,但是在一个更复杂的游戏中,这是不实际的。 另外请记住,有一个数据包的开销,所以如果你发送一堆小包,你会浪费带宽。

每个更新间隔都有每个客户端向服务器或每个客户端(点对点)发送其桨位置。 让服务器也发送球的位置和速度vector。 每个客户端可以运行相同的屏幕绘图代码,就像在单人游戏中一样,这样球的运动就会平滑。 在多人游戏中,尽管你只有服务器定期发送球的位置/速度更新(如果你喜欢每次击球)。

在所有的客户端都有球位更新参考游戏时间,所以你可以丢弃乱序包,甚至使球的位置插值更准确(你知道在过去的特定时间的位置和速度,所以你可以插入新的位置)。

如果这个模型有一个滞后的游戏,你可能会看到球有时候向后移动,或者跳了一下。 但是,一个体面的连接应该是相当顺利的。

关于stream量问题 – 您希望避免每个对等方每秒发送超过20-30个数据包。 在一般情况下,如果发送更小,更less的数据包,您将体验(稍微)更less的延迟,并减less数据包丢失的可能性。

你绝对不希望以比帧率更快的速度发送更新,因为玩家将无法区分这种差异 – 实际上,如果你每秒只发送数据包10次,并在接收端内插/外插结果,大多数玩家不会注意到差异。

这是一个相当广泛的问题,但我会尽量总结重要的方面。

在你的游戏的networking代码中做出的第一个决定是你是否想要一个对等安排的客户端/服务器设置。 大多数带有RTS的游戏可能是唯一明显的例外,可能是使用客户端/服务器架构。 主要的优点是这种安排更具有容错能力,能够更好地控制每个客户端收到的数据。 点对点允许发送less得多的数据,但要求每个对等方都像其他对等方一样完全模拟世界。 如果一个同伴落后或不同步,每个人都必须等待他们恢复,否则他们就会丢失。

对于任何客户端/服务器模型,UDP一般也是正确的select。 TCP对于点对点游戏来说可能是实用的,但即使如此,UDP也许是更好的select。 基本上,UDP对你的处理较less,这意味着更多的努力,但也更多地控制你如何处理错误。

对于乒乓select我会做客户端/服务器,因为它是一个面向行动的游戏。 有一件事要注意,即使你说一个玩家“是服务器”,你最好的方式就是构造你的代码,使它们本质上运行本地服务器并作为客户端连接到它。

你绝对不希望在任何方向“垃圾”更新。 每个服务器每个帧的更新都是需要的,你的服务器应该以固定的帧速率运行。 这是由你决定的,但是没有必要太过分了。 一个50ms的框架(20 FPS)是很多得到不错的stream畅的游戏。 为了保持客户端的顺畅,你要利用插值。 客户端应该不断地在服务器帧快照之间转换,但这很容易成为单独问题的主题。

客户端更新也应该受到限制,但是如果您的客户端以合适的帧速率运行,则每帧可能会太多。

你在乎作弊吗?

如果不是,那么点对点会减半,因为它是A→C而不是A→B→C。 如果是这样的话,为了保持同步公平,你可能要对本地玩家做出回应,或者大部分游戏都做些什么 – 让玩家在本地做任何事情,然后在服务器的结果与本地模拟结果不一致的情况下做出回应。

乒乓克隆实际上有点棘手,因为与大多数游戏不同(作为开发者),通过让一方看到命中而另一方不能。

至于概括的东西,我听说过的一个技术,但没有发现必要的(可能是动作游戏),是保持行动与他们的真正的时间戳(接收时间ping / 2),并让服务器回滚快照),如果一个早期的事件进来,然后重新应用以后的行动。 这样,每个人在本地都是一致的,除非由于不同的玩家互动而产生冲突。 唯一的危险是如果他们伪造一个滞后的联系,那么他们就有能力“回滚时间”。

谷歌推测。 发送4个玩家的更新不会很重要。 发送的数据量将按字节顺序排列。 所以,这意味着经常更新应该是可以的。 借助航位推algorithm,您可以在客户端和服务器上移动播放器。 服务器是权威。 当客户端的位置与服务器的距离太远时,就不得不重新alignment。 http://trac.bookofhook.com/bookofhook/trac.cgi/wiki/Quake3Networking使用UDP是要走的路。 Bupdates将被频繁地发送,丢失的数据将很快被传入的数据replace。 TCP的数据包重传不值得玩家的地位。 请阅读本文以获取有关如何保持客户端和服务器同步的更多信息。

几个星期前,我编写了一个2人本地networking乒乓球游戏,下面是我做的:

一方打开一台服务器,另一方自动连接 – 它们都是向对方发送电子邮件x位置60fps或更less[UDP] – 如果一方击中他们决定球的新速度和位置的球,并发送到另一个(TCP) – 如果球飞过桨,错过它的球员与增加的比分信息接触另一球并且球重置[TCP] – 球一直独立地被模拟,适合乒乓球的简单球物理

这会在60fps下产生大约0.3到0.5千字节/秒的stream量,并且玩家在他们的感知上没有滞后,但是只有当ping低于一定的阈值时,因为需要传输球的新位置。

这个系统也很容易作弊,并且很有可能与一个非常有损耗的连接不同步,但是谁在乎作弊?