如何为多人游戏构造简单的游戏服务器?


9

我想为一个简单的游戏创建一个简单的多人游戏服务器:

游戏应该类似于《命令与征服》,您有一些战车和一些士兵。您可以选择一名士兵,然后单击地图以选择该士兵应去的地方。如果士兵来到他不能去的地方,他就会走来走去。士兵会被敌人击落。

我应该如何构造游戏服务器,以及在客户端应该做什么?

即,如果一个士兵从X移到Y但在建筑物Z周围,我想服务器必须能够准确计算出士兵所在的位置(以防敌人向他开枪),客户也必须知道位置画士兵。

应该在服务器上做什么,我想我必须为此设计一个协议。我认为服务器必须跟踪游戏状态和时间。是否有人对此有建议?还是可以推荐一些阅读材料?

Answers:


12

总的来说,这是一个非常复杂的主题。您有两个相互矛盾的目标(至少如果您不打算在专用服务器上运行每个游戏的话):

  1. 您将希望在服务器上尽可能多地完成操作,既防止作弊,又确保所有客户端看到的都是相同的东西。
  2. 但是您还希望事情公平,这意味着如果一个人对服务器执行0次ping操作而其他人存在网络滞后,则当两个人同时向其单元发出命令时,“服务器”播放器就具有优势。

我不能确切地说如何解决RTS。对于FPS触发,我们要做的是让服务器保存一段时间后的完整世界状态,并让客户端为每个镜头加盖时间戳。当网络消息为“我被解雇了!”时 到达服务器后,服务器可以回滚世界,并在“射击时寻找客户端”时对世界进行碰撞测试等。

如果您打算有很多单元,那么还会遇到服务器处理量过多的问题。如果您不十分担心黑客攻击或作弊,我建议对客户端进行寻路,然后将结果发送到服务器。

另一种选择可能是改为使用peer2peer,让每个客户处理本地团队的更新,但这又提出了一个问题,即如何确定谁击中了什么等等。

根据项目的复杂程度以及您愿意为此付出多少努力,我的最佳建议是确定一些初步的内容并开始进行测试。


1
实际上,存在三个(甚至更多)相互矛盾的目标。第三是性能,完全在服务器上保持和更新实时游戏的状态会占用大量资源。
Bart van Heukelom

2
哦,您可以通过引入与其他玩家的平均时间相等的人为延迟来轻松解决第二个问题。好吧,如果您可以称其为“使每个人都变得更糟”是一种解决方案。
Bart van Heukelom

@Bart:部分正确,但当然应该对人为引入的延迟设置上限,否则较慢的连接可能会不断迫使较快的连接滞后太多,这绝对是您现在想要的。
o0'。

只要在客户端上找到最佳路径,只要他发现了最佳路径,就可以将解决方案发送到服务器,这与所有移动一样,都将检查是否正确。
o0'。

2

基本上有两种方法:

  1. 值得信赖的客户
  2. 不信任的客户

受信任的客户端稍微复杂一点,但是它的优点是您可以从服务器上卸载大量计算。服务器运行成本是多人游戏的最大问题之一,它将严重降低您的可扩展性。

对于初学者来说,一个好的方法是让每个玩家客户端处理自己的单元。在下一步中,您可以使用备用周期让玩家客户验证其他客户的动作。服务器除了交换消息,保持同步并确保持久性(例如数据库)外,不需要做更多的事情。

如果您打算进行某种形式的游说或聊天,则可以在额外的服务器中处理所有这些主题。这将使事情变得容易得多。


谢谢,这是有益的。我想我会去寻找不受信任的客户,并且必须完成服务器上的工作。一开始我不会有很多玩家。
乔纳斯(Jonas)2010年

1
“我不会有很多玩家...”我无法数出给我那条路线并在六周后回来的开发人员数量:“我有这5000名玩家想要付费玩我的游戏,但我无法扩展:(“。请记住这一点!
Andreas

9
“信任客户”不是一种方法,这是一个错误。
o0'。
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.