手机版

Node.js制作实时多人游戏框架

时间:2021-10-15 来源:互联网 编辑:宝哥软件园 浏览:

随着Node.js的快速发展,我们已经可以用它来做各种事情了。前段时间,UP大师参加了极客之歌活动。在这次活动中,我们打算做一个游戏,让“低头族”多交流。核心功能是具有兰党概念的实时多人互动。极客之歌的比赛只有可怜的短短36个小时,要求一切都要快速敏捷。在这样的前提下,最初的准备似乎是“自然”的。我们选择了node-webkit进行跨平台应用,足够简单,符合我们的要求。

根据需求,我们的开发可以按照模块单独进行。本文具体描述了Spaceroom(我们的实时多人游戏框架)的开发过程,包括一系列的探索和尝试,以及解决Node.js和WebKit平台本身的一些局限性,并提出解决方案。

入门Spaceroom乍一看,Spaceroom的设计必须是需求驱动的。我们希望该框架能够提供以下基本功能:

能够按房间(或频道)区分一组用户,能够接收集合组内用户的指令,能够按照指定的时间间隔精准播放游戏数据,能够尽可能消除网络延迟带来的影响,当然在编码后期,我们为Spaceroom提供了更多的功能。包括暂停游戏、在客户端之间生成一致的随机数等。(当然这些可以根据需求在游戏逻辑框架中自行实现,不需要使用Spaceroom,这是一个比较有交流性的框架)。

蜂房分为前后两部分。服务器需要做的工作包括维护房间列表和提供创建房间和连接房间的功能。我们的客户端API是这样的:

Spaceroom.connect(地址,回调)连接到服务器spaceroom.createroom(回调)创建一个room space room . join room(roomid)加入一个roomspaceroom.on(事件,回调)监控事件…客户端连接到服务器后,它将接收各种事件。例如,房间中的用户可以接收新玩家加入的事件,或者游戏开始的事件。我们给客户一个“生命周期”,它随时会处于以下状态之一:

您可以通过spaceroom.state获取客户端的当前状态.

使用服务器端框架相对简单。如果使用默认配置文件,可以直接运行服务器端框架。我们有一个基本要求:服务器代码可以直接在客户端运行,而无需单独的服务器。玩过PS或者PSP的玩家应该知道我在说什么。当然,在特殊的服务器上运行是非常好的。

这里简化了逻辑代码的实现。第一代Spaceroom完成了Socket服务器的功能,它维护着房间列表,包括房间的状态和游戏时的通信(指令收集、桶广播等)。)对应每个房间。具体实现参见源代码。

同步算法

那么,如何才能让客户端之间显示的一切实时一致呢?

这个事情听起来很有趣。仔细想想,我们需要服务器为我们交付什么?很自然地会想到什么会导致客户端之间的逻辑不一致:用户指令。由于所有处理游戏逻辑的代码都是相同的,给定相同的条件,代码的运行结果也是相同的。唯一不同的是游戏过程中收到的各种玩家指令。当然,我们需要一种方法来同步这些指令。如果所有客户端都可以得到相同的指令,那么理论上所有客户端都可以有相同的运行结果。

网络游戏的同步算法多种多样,适用场景也各不相同。Spaceroom采用的同步算法类似于帧锁定的概念。我们把时间轴分成区间,每个区间叫做一个桶。Bucket用于加载指令,由服务器维护。在每个时段结束时,服务器向所有客户端广播该时段。客户端得到桶后,从桶中取出指令,验证后执行。

为了减少网络延迟带来的影响,服务器从客户端接收到的每条指令都会按照一定的算法传递到相应的桶中,具体按照以下步骤进行:

假设order_start是指令携带的指令的出现时间,t是order_start所在的桶的开始时间。如果t delay_time=当前正在收集指令的存储桶的开始时间,则将指令传送到当前正在收集指令的存储桶。否则,继续步骤3,将指令传递给t delay_time对应的bucket,其中delay_time是约定的服务器延迟时间,可以作为客户端之间的平均延迟,Spaceroom中的默认值。

版权声明:Node.js制作实时多人游戏框架是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。