我有一些使用 sockets 制作多人 回合制 游戏的经验,但我从未尝试过实时动作游戏。我需要处理哪些额外问题?在玩家有延迟的情况下,我需要保存玩家的操作历史记录吗?我真的需要使用 UDP 数据包还是 TCP 就足够了?还有什么其他问题需要考虑?
我还没有确定要制作什么样的游戏,但出于这个问题的目的,您可以考虑一个具有 X Y 移动的 10 人 2D 游戏。
我有一些使用 sockets 制作多人 回合制 游戏的经验,但我从未尝试过实时动作游戏。我需要处理哪些额外问题?在玩家有延迟的情况下,我需要保存玩家的操作历史记录吗?我真的需要使用 UDP 数据包还是 TCP 就足够了?还有什么其他问题需要考虑?
我还没有确定要制作什么样的游戏,但出于这个问题的目的,您可以考虑一个具有 X Y 移动的 10 人 2D 游戏。
对于回合制游戏,通常很容易只需说“服务器具有终极权威性并完成”,就可以了。但对于实时游戏来说,设计的起点通常是不错的选择,但一旦添加延迟,客户端的移动/行为会感觉迟钝。因此,你需要添加某种形式的“延迟隐藏”来允许客户端的输入立即影响其角色或单位以解决该问题,现在您必须处理当客户端和服务器的游戏状态开始分歧时的协调问题。9次中会有8次随意弹出或插值客户端已经影响的对象到权威位置,但1次中如果该对象是玩家头像或其他重要对象,则此解决方案是不可接受的,因此您开始授予客户端对某些操作的权威性。现在,您必须在服务器上协调多个游戏状态,并可能遭受通过恶意客户端进行作弊的风险,如果您关心这种事情,则会遇到基本上每次传送/复制/任何bug/作弊问题。
当然,您可以开始采用“每个客户端都对其对象具有权威性”的模型,并忽略作弊问题(在很多情况下是可以的)。但现在,如果该客户端退出或“稍微落后于保持与模拟同步”的情况,您就会面临游戏模拟受到巨大影响的风险 - 事实上,每位玩家的游戏将受到等待滞后客户端追赶或者控制游戏状态不同步的影响。
设置多人游戏涉及到一些因素。
协议,你需要决定是使用TCP还是UDP。UDP的开销较小,但无法保证传输的可靠性。相反,TCP更加可靠。每个游戏都有其首选的协议。例如,第一人称射击游戏可以使用UDP,但可能不适合需要信息保持一致的RTS游戏。
防火墙/连接。确保你的多人游戏不需要进行2000个出站连接,并使用标准端口以便于端口转发。与Windows防火墙进行接口可能是一个额外的优势。
带宽。这很重要,你打算通过网络连接传输多少数据?我猜这将取决于游戏测试和记录吞吐量。如果你需要每个客户端超过200kb/s的速度,你可能需要重新考虑一些事情。
服务器负载。这也很重要,一个正常游戏所需的服务器处理量有多大?你需要一台拥有8核16GB内存的超级服务器来运行它吗?是否有减少服务器负载的方法?
我想还有很多其他因素,但实际上你想要的是一款能够在网络上和各种连接下舒适游玩的游戏。
TCP在局域网上运行很好。但是如果您想玩在线游戏,必须使用UDP并实现自己的类似TCP的层:这是必须通过NAT路由器的。
您需要在点对点或客户端服务器通信之间进行选择。在客户端-服务器模型中,实现世界状态和同步更容易,但可能会在在线反应方面存在缺乏。在点对点中更为复杂,但对于玩家来说更快。
不要为了游戏目的而保留玩家动作历史记录(做到这一点,但仅用于重播功能)。如果达到必要条件,请优先让每个玩家等待。