2011-08-24 184 views
16

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

我打破了关于什么是最好的概念来同步客户端。

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

另一种可能性是在服务器上计算游戏。客户端仍然向服务器发送指令,但是服务器现在将所有单元&建筑物的所有改变的状态以高时间间隔发送给客户端。问题是这里的数据量很大,速度有多快......

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

谢谢!

回答

20

基本上你必须决定在速度安全

让客户端完成这项工作,计算速度更快,但数据处于风险之中,因为客户端可以操纵数据。

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

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

这也取决于如何快速的游戏运行,数据量来计算,服务器和乐队/连接的速度,等等

你应该原型两种方法,并尝试了一些测试,以模拟客户端和服务器加载。

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

这里有几个链接对您有所帮助

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

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

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

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

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

0

不知道有关WebGL的,但我的理解下面的方法将是很好的。

  1. 初始化服务器上​​的所有对象(这是整个玩家常见),并运行它们
  2. 在客户端启动,它会请求在服务器上运行对象的所有渲染器(与特定的客户端)。
  3. 客户端将为所有接收到的渲染器渲染UI上的对象。
  4. 当客户端作出UI任何更新,改变将被通知给服务器,服务器将更新对象相应
  5. 当对象玩家之间共同由一个玩家被修改,每个玩家(客户端)将被通知,使UI变化。

这种方法将特定于通用对象而不是UI /客户端特定对象。

1

你应该有比赛的状态和逻辑在服务器上,否则你的游戏是敞开的作弊。服务器是游戏状态的最终权威。

0

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

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

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

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