Articles of node.js

Node.js锁步多人体系结构

背景 我在客户端 – 服务器体系结构中为多人Node.js / Socket.IO游戏使用了锁​​步模型。 用户input(鼠标或按键)被parsing成客户端上的'attack'和'move'等命令,这些命令被发送到服务器并被安排在特定的时间点执行。 这与将状态数据发送给客户端相反,因为带宽问题,我不想使用它们。 每次打勾,服务器都会将该打勾的命令列表(可能为空)发送给每个客户端。 然后服务器和所有客户端将处理命令并以完全相同的方式模拟该打勾。 有了Node.js,实际上这很简单,因为可能在服务器和客户端之间共享代码。 我只是将确定性模拟器放在可以由服务器和客户端运行的/共享文件夹中。 服务器仿真是必需的,以便有客户端不能改变的仿真权威版本。 问题 现在,游戏中有很多实体类,比如Unit , Item , Tree等。实体在模拟器中创建。 但是,对于每个类,它都有一些共享的方法,一些是特定于客户端的方法。 例如, Unit类具有共享的addHp方法。 它也有getSprite (获取实体的图像), isVisible (检查单元是否可以被客户端看到), onDeathInClient (当它只在客户端上死了,像添加公告一样)和isMyUnit (快速函数来检查客户是否拥有该单元)。 到目前为止,我一直在将所有的客户端函数放到共享的Unit类中,并在必要时添加一个this.game.isServer()检查。 例如,当单位死亡,它会调用if (!this.game.isServer()) { this.onDeathInClient(); } if (!this.game.isServer()) { this.onDeathInClient(); } 。 就function而言,这种方法迄今为止工作得相当好。 但是随着代码库的增长,这种编码风格似乎有点奇怪。 首先,客户端代码显然不是共享的,而是放在/ shared文件夹下。 其次,每个实体的客户端特定variables也在服务器实体(如unit.sprite )上实例化,并且当服务器不能实例化variables(它没有像浏览器那样的Image类)时会遇到问题。 所以我的问题是,有没有更好的方法来组织客户端代码,或者这是一个常见的方式为锁步多人游戏做事情? 我可以考虑一个可能的解决方法,但它确实有它自己的问题。 可能的解决方法(有问题) 我可以使用仅在浏览器中添加的Javascript混搭。 因此,在/ shared文件夹中的/shared/unit.js文件中,最后我会得到这段代码: if (typeof […]

当服务器计算与客户预测不一致时,如何更正客户端的移动?

我有一个简单的一些游戏。 建立: 有一个权威的服务器连接到多个客户端。 相同的物理代码在服务器和客户端上运行 当收到input时客户端立即移动(预测服务器计算) input然后发送到服务器和服务器更新游戏状态 服务器将游戏状态发送回客户端 最后一步是我的问题所在: 客户端根据发送的游戏状态服务器来修正其位置,但同时另一个input已经被处理 – 这个input将不得不根据修正后的位置再次模拟 – 这感觉非常笨重,我无法正常工作。 准确地说,我的问题是模拟input和客户端上的位置更正后的世界。 我觉得没有可行的办法,我必须及时回到地图状态(有可移动的平台等)。 有没有其他的networking架构与权威的服务器,这是处理更容易(即使是在安全的代价)? (我不知道它是否相关,但我使用节点js后端和js前端(canvas)的套接字)

如何处理多个房间的服务器更新? (的NodeJS)

我正在使用socketio + nodejs进行多人游戏。 目前我在我的服务器上使用setInterval,在我的客户端渲染上使用requestAnimation。 现在我想为每个房间创建多个游戏实例,所以我问如何有效地做到这一点: 我是否为每个创建的游戏初始化一个新的setInterval,并在游戏结束时调用clearInterval? 要么… 我应该只创建setInterval的一个实例,并循环通过每个活动的游戏,并更新它们? 我应该使用setInterval吗? 编辑:澄清,我目前的单setInterval只是在约15hz做到这一点: 根据input更新每个玩家的位置 – 通知所有新职位的客户 一旦客户端发送它们,就会收到input,由socketio处理。 发送这么多的发射是故意的,因为我的服务器是权威的,我的游戏很慢(想象一下蛇的克隆)。 我打算允许尽可能多的游戏,因为有房间,这是不确定的(或多达一个服务器可以处理)

处理多人射击游戏中的延迟

我有一个架构的想法,我想知道是否有人执行这样的事情,或者使用AWS或其他服务来帮助? 我想过使用NodeJS + SocketIO来处理服务器端的这种合作性的shmup(想想雷电或Galaga),我们正在开始工作。 我们开始考虑延迟问题。 我提出的解决scheme是在2个用户玩一些epsilon值(比如300miles或者其他东西)的用户的中间点旋转/closures服务器。 也许服务器将允许多达50个用户同时玩,然后它会拒绝请求,这将popup另一个服务器。 这应该会导致2个玩家的等待时间大致相等。 而且,如果我们正在匹配制作用户,那么我们总是将两个最近的用户配对在一起。 我认为还有其他因素需要考虑,比如用户技能水平,但是我认为现在我们最关心的是延迟,因为它直接影响游戏性。 其实我们的比赛确实需要相当准确的时间。 此外,我们希望用户能够看到彼此拍摄,因为当他们相互同步时,很酷的animation发生。 我想这与战斗游戏在时间/精度方面的运作方式类似。 想法? 思考? 别人怎么解决这个问题呢? 我在哪里可以开始寻找例子?

在塔防游戏中接近客户端和服务器之间的同步

我目前正在制作一款多人游戏TD,玩家可以参加游戏,并在地图上放置塔,非常好。 这就是今天游戏的运作方式,当一个新的游戏被创建,服务器初始化一个主游戏,基本上所有的逻辑都发生在这里,它告诉客户可视化的东西。 但是这是我的第一个MP游戏,我需要一些关于如何让玩家与服务器游戏同步的建议,我的问题可能是。 “如果玩家与服务器失去联系几秒钟,该怎么办,因此失去同步”“如果玩家的networking连接不好,并且延迟从400毫秒跳到3000毫秒,该怎么办” 我想每秒发送数据给每个客户4次,包含板上所有实体的信息。 然后,我将这些数据与客户端数据进行比较,并且推翻不同步的实体,那么就会有一个容忍的价值,所以用户不会遇到由于小的游戏延迟而在板上发生的变化。 不过,我可以想象这将是一个很大的工作,我想问是否有一个更聪明的解决scheme,我看了一些在networking上的post,但没有find任何适用于我的游戏,感觉自由以我的方式扔链接。

关于构建一个实时多人networking平台+框架和/或takeit的提示

我试图开发一个多玩家游戏的networking应用程序,基本上应该能够实现以下目标: 提供游戏引擎+框架/工具箱让第三方公司整合自己开发的游戏。 游戏必须运行实时和多人游戏。 所以这个想法是开发一些框架或工具包,以轻松实现上述目标。 只要我不想重新发明轮子,我需要validation每个客户的行动,而在下面的房屋,我想知道你的意见: Web应用程序将使用PHP语言开发。 客户端连接将通过socket.io.js进行管理 服务器validation将在Node.js上运行 为了让第三方开发他们的定制游戏,我需要采用一个可以运行在顶端的游戏引擎,哪一个? 因为我不是专家,所以根据你的经验,我正在寻找一些建议或反馈,并让我知道我是否正确的方向。

我如何实现像素精确的碰撞服务器端?

最近,我用HTML5 Canvas和JavaScript制作了2D离线游戏。 我通过首先检查图像边界框是否重叠来检测碰撞。 如果他们这样做,我检查边界框,看看是否有任何像素存在于同一位置的两个图像。 我从这个教程学习了技巧(YouTube) 。 现在,我正在使用客户端 – 服务器configuration制作游戏的多玩家版本。 我决定让服务器处理所有的物理,包括碰撞。 但是,我不知道如何实现。 由于图像是在客户端绘制的,因此服务器无法访问图像数据来进行像素碰撞testing。 我可以在服务器端创建边界框,但是如何检测像素冲突? 技术细节:我打算在node.js中编写服务器,使用CouchDB或MongoDB作为我的数据库。

开发一个通用多人API

我的任务是在JavaScript中开发一个通用多人API,并带有一个Node.js后端。 API的目标是为JavaScript手机游戏开发者提供服务,以便他们可以使用简单易用的API和现有的后端开发多人游戏。 该项目还包括开发实现,Node.js服务器和testing游戏,否则我无法testing它的课程。 所以把它称为整个图书馆的发展是更准确的。 我遇到的问题是试图找出如何提供一个很好的游戏同步机制。 图书馆可以提供房间和连接管理,朋友列表,注册和soforth,因为这些东西在每个游戏中都使用相同的机制。 然而,游戏同步逻辑可以是非常特定于游戏的,并且在通用库和服务器中是绝对不允许的。 我正在使用以下库/框架进行开发: Node.js作为游戏服务器。 客户端和服务器端的Socket.io用于websocket通信。 Require.js客户端启用模块化开发。 Redis作为持久存储的数据库。 为了澄清图书馆的目标: 支持各种各样的游戏,从基于回合的100个可同步对象的策略游戏到多人自上而下的射击游戏,延迟是最重要的。 没有客户必须扮演某种“服务器”的角色。 最小化手动设置客户端。 精确同步,无需同步整个游戏状态。 服务器 – 客户端体系结构没有包含游戏特定代码的服务器。 不应该对开发者构成限制,也不应该要求某些编码实践。 提供一个易于使用的抽象来使用通用同步机制。 整个游戏范围必须由相同的通用服务器逻辑来支持。 在API或服务器上滞后补偿必须是自动的,但不是游戏特定的。 所以对于主要问题:这是可能的还是应该提供一种方法来轻松地投射,多播和广播消息,并将实际的同步机制留给开发人员? 你将如何去呢?

Node.js 3D游戏?

它会适合在开放的世界中制作3D游戏吗? 当然规定我: 创建一个节点加载项来绑定opengl 编写一个本地层来制作线程和进程 我几乎可以听到你:为什么节点? 因为我喜欢coffeescript,而且我对这种语言更有经验(我不能在c ++中得到指针),主要是因为我希望它是跨平台的,可以破解的 。 但是节点足够快吗? 编程模式如数据局部性在节点中工作吗? CPU负载呢?

nodejs游戏服务器计时器

我是游戏服务器开发的新手。 我正在开发一个纸牌游戏服务器。 如何让nodejs服务器等待几秒钟,然后在事件触发后将数据推送到客户端? 例如:在扑克游戏中,一个玩家有20秒左右的动作,20秒后服务器会自动折叠,然后将消息推送给另一个玩家。 我怎么能让服务器等待20秒,然后做下一个动作?