战略游戏服务器概念

时间:2011-08-24 08:45:11

标签: javascript node.js websocket webgl

我计划创建一个基于WebGL的实时策略游戏,让玩家可以一起玩。我将使用Node.js创建游戏服务器,并使用websockets实现实时连接。

我已经忘记了同步客户端的最佳概念。

一种可能性是仅将用户的订单(移动单元,建筑物等)发送到服务器,服务器将它们发送给所有其他客户端。但在这里,我有延迟的问题。我认为游戏会以这种方式异步。

另一种可能性是在服务器上制作游戏。客户端仍然将指令发送到服务器,但服务器现在将所有单元和建筑物的所有已更改状态以高间隔发送给客户端。问题在于大量数据以及数据的速度......

您是否有其他想法或改进建议?

谢谢!

6 个答案:

答案 0 :(得分:21)

基本上你必须在速度安全性之间做出决定。

让客户端完成工作并且计算速度更快但数据存在风险,因为客户端可以操作数据。

另一方面,让服务器完成所有工作的速度较慢,但​​数据更安全。

您可以选择双重方法,决定让客户端只计算一些数据,同步然后检查其有效性,然后让其余数据在服务器上执行。

这还取决于游戏的运行速度,计算的数据量,服务器和频段/连接的速度等等。

您应该对两种方法进行原型设计并尝试一些测试来模拟客户端和服务器的负载。

如果游戏很小,我会选择更多的服务器端工作。另一方面,对于一个复杂的游戏来说,最好是向客户分享更多的工作。无论如何,我认为总是需要权衡。

以下是一些您可能会觉得有用的链接

Multiplayer Game Programming Introduction

Real time strategy networking

Multiplayer Programming thread (old but still with many useful links)

Lag Compensation

Prevent Multiplayer Cheating

第一个链接帮助了我很多时候,imho仍然是有关该主题的最佳资源之一。

<强>图书

Multiplayer Game Programming

答案 1 :(得分:6)

答案 2 :(得分:1)

不幸的是,我没有基于WebGL的在线游戏的经验,但通常这是让游戏逻辑在客户端执行并同步结果的好方法。

在这种方法中,重要的是跟踪哪个游戏对象被哪个客户“拥有”。客户端仅从其自己的对象发送更新(创建,更新,删除),并从其他客户端接收其他游戏对象的更新。

此外,您可以设置一个消息传递框架来传递其他消息,例如“玩家已进入/离开”或类似的内容。

这个概念已证明对我创建的游戏很有用,我希望它对你有用。

答案 3 :(得分:1)

你应该在服务器上拥有游戏状态和逻辑,否则你的游戏就会被欺骗。服务器是游戏状态的最终权威。

答案 4 :(得分:0)

不确定WebGL,但根据我的理解,下面的方法会很好。

  1. 在服务器上初始化所有对象(在玩家之间通用)并运行它们
  2. 在客户端启动时,它将为服务器上运行的对象请求所有渲染器(与特定客户端相关)。
  3. 客户端将在UI上为所有收到的渲染器渲染对象。
  4. 当客户端在UI上进行任何更新时,更改将通知服务器,服务器将相应地更新对象
  5. 当一个玩家修改玩家之间的共同对象时,将通知每个玩家(客户)进行UI更改。
  6. 此方法将特定于常见对象而非UI /客户端特定对象。

答案 5 :(得分:0)

出于安全原因,所有逻辑都应位于服务器端,并且所有数据更新都在服务器上。

但客户端能够预测某些逻辑并首先播放动画,这称为客户端预测。

服务器端负责验证客户端逻辑,如果没有作弊,则全部完成。 如果有人作弊,服务器可以告诉客户端返回正确的状态。

如果您将node.js用于服务器,则有一个开源框架pomelo。 还有一个完整的源代码演示和在线演示:lordofpomelo