Windows Phone XNA射击游戏 => UDP,TCP还是混合使用?

3

我几个月前在Windows Phone上开发了一款实时快节奏射击游戏,然后将游戏移植到了Windows平台。

现在我正在考虑使游戏具有多人在线功能,但由于我以前从未尝试过,所以有一些问题:

考虑到这是一个射击游戏,所以会有很多子弹、各种类型的游戏对象、玩家/怪物的移动等等:

  • 在这种情况下,使用异步socket是否足够快?(WP与Windows玩家或WP与WP或Windows与Windows)
    • 注意:玩家将通过一个集中式socket服务器进行通信
  • Windows Phone的socket性能是否足够好?(3G/4G,Wifi)
  • 应该使用TCP还是UDP或二者兼用(例如,UDP用于对象/动作,TCP用于聊天)
  • 您将如何发送数据,将发送什么类型的数据以及多久发送一次?

非常感谢!:)

4个回答

3
通常射击游戏使用UDP发送带有子弹的数据包,不太关心是否能100%地传送它们,因为会发送很多数据包并且即使在电缆中丢失几个也无所谓。但是,如果出现问题,为什么不先尝试使用TCP,然后再切换到UDP呢?

1
一般建议是发送最少量的信息,通常是用户输入而不是世界状态。
例如,在游戏进行到第142秒时,用户A按下了开火按钮。在145秒时,用户B开始向左移动。
(由于用户输入,每个客户端都可以重新创建世界状态...通常情况下。如果你有随机元素,那么这是一个捕捉和重新思考设计的好方法。)
至于协议选择,我建议从HTTP开始,并从中“向下”工作。这提供了最大的“内置”功能(如NAT穿透和代理),并希望尽早突出任何可能存在的网络逻辑问题(例如,您的预测算法是否与玩家的游戏风格相当接近,以便在客户端上发生重新同步时,“弹回”不会让人烦恼)。
当/如果您确定HTTP太重/慢,则可以将其替换为UDP,并了解需要实现什么。

谢谢回复。你有关于如何处理世界对象的建议吗?例如:怪物移动、怪物生成、怪物死亡、子弹飞行等等。这里有很多信息需要同步,我认为这是绝对必要的! - Armkreuz
通常我建议你真正想要达到的状态是,任何NPC(和环境)的移动都是完全确定性的,因此每个客户端都可以推导出它,而无需进行聊天。例如,如果你知道玩家角色何时何地按下了“开火”按钮,那么每个客户端都应该能够计算出子弹的轨迹,而无需传输或接收它。 - lzcd

1
我会从其他游戏中借鉴好的想法,甚至不惜采用窃取的方式。id Software's Quake 3 的网络源代码是公开的,许多人已经对其进行了解剖。大多数第一人称射击游戏今天都使用UDP以确保及时传递时间敏感数据。被丢弃的旧数据不应该需要一个新数据包。
Quake 3使用一种策略,即每个客户端数据包都发送最后已知的良好快照ID,并且服务器在内部每个快照都发送一个ID。此时,当客户端丢失数据时,它会继续在其端发送最后已知的良好ID,而服务器则从其快照缓冲区发送差异。
如果您使用TCP,则必须等待每个客户端确认旧数据,这将增加人为延迟,这对于第一人称射击游戏来说是无法容忍的。

0

混合使用:用于身份验证、登录或更改服务器/客户端信息时,请使用TCP,但在游戏中,当大多数数据通过电缆传输时,请使用UDP。由于面向连接的操作,TCP会导致更高的延迟。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接