战略游戏服务器概念
我打算创build一个基于WebGL的实时策略游戏,玩家可以一起玩。 我将使用Node.js来创build游戏服务器,以及用于实时连接的websocket。
我打破了什么是同步客户最好的概念。
一种可能性是仅将用户(移动单元,build筑物等)的订单发送到服务器,服务器将其发送到所有其他客户端。 但是在这里,我有延迟的问题。 我认为游戏会以这种方式获得asynchronous。
另一种可能性是在服务器上计算游戏。 客户端仍然向服务器发送指令,但是服务器现在将所有单元和build筑物的所有改变的状态以高的间隔发送给客户端。 问题是这里的数据量很大,速度有多快。
你有其他的想法或改进scheme吗?
谢谢!
基本上你必须决定速度还是 安全 。
让客户做这项工作,计算速度更快,但数据处于风险之中,因为客户可以操纵数据。
另一方面,让服务器做所有的工作比较慢,但数据更安全。
你可以select一个双重的方法,决定让客户端只计算一些数据,同步,然后检查其有效性,让其余的在服务器上执行。
这还取决于游戏的运行速度,计算的数据量,服务器的速度和频段/连接等等。
您应该原型化这两个方法,并尝试一些testing来模拟客户端和服务器负载。
如果游戏很小,我会select更多的服务器端工作。 另一方面,对于一个非常复杂的游戏来说,分享更多的工作给客户可能是最好的。 无论如何,我认为总是需要权衡。
以下是一些您可能会觉得有用的链接
多人游戏编程介绍
实时战略networking
多人编程线程(旧的,但仍然有很多有用的链接)
滞后补偿
防止多人作弊
第一个环节帮了我很多时间,imho仍然是这个问题上最好的资源之一。
图书
多人游戏编程
我build议观看这些关于基于浏览器的游戏开发概念的资源:
- 多人游戏与HTML5:我们准备好了吗?
- 实时HTML5多人游戏与Node.js
- HTML5游戏0.3:看未来
不幸的是我没有基于WebGL的在线游戏的经验,但通常这是让游戏逻辑在客户端执行并同步结果的好方法。
在这个方法中,跟踪什么游戏对象是由什么客户“拥有”是很重要的。 客户端只从自己的对象发送更新(创build,更新,删除),并从其他客户端接收其他游戏对象的更新。
另外,你可以设置一个消息框架来传递像“玩家已经进入/离开”或类似的东西。
这个概念已经certificate对我创build的游戏有用,我希望它对你有用。
你应该在服务器上拥有游戏的状态和逻辑,否则你的游戏就会被欺骗。 服务器是游戏状态的最终权威。
不知道有关WebGL,但以我的理解以下方法将是很好的。
- 初始化服务器上的所有对象(这是在玩家间通用的)并运行它们
- 在客户端启动时,它将请求所有呈现器(与特定的客户端相关)在服务器上运行的对象。
- 客户端将为所有接收到的渲染器渲染UI上的对象。
- 当客户端在UI上进行更新时,更改将通知服务器,服务器将相应地更新对象
- 当一个玩家修改玩家之间的共同对象时,将通知每个玩家(客户)进行UI改变。
这种方法将特定于通用对象而不是UI /客户端特定对象。
出于安全原因,所有的逻辑应该在服务器端,所有的数据更新都在服务器上。
但客户端能够预测一些逻辑并首先播放animation,这就是客户端预测。
服务器端负责validation客户端逻辑,如果没有作弊,全部完成。 如果有人作弊,服务器可以告诉客户回到正确的状态。
如果您使用node.js作为服务器,则有一个开源框架柚子 。 还有一个完整的源代码演示和在线演示: lordofpomelo