node.js适合游戏后台开发吗?


Posted in Javascript onSeptember 03, 2014

网站服务器和游戏服务器是怎么样联系到一起的?

1. 游戏分很多种,咱们先来看看MMORPG。

再怎么简单的RPG服务器都免不了处理多人交互的情形,上百人在同一个场景里面,每个客户端都需要收到其他所有人的操作信息。

其次,用户的操作是非常频繁的,一般的服务器倾向于持有长连接。而且这些链接的是频繁交互的,没有明显的持久的分区策略,所以限制了服务器的横向扩展,同一个场景往往只能放在一个物理机上面运行。

再次,端游通常是不敢把逻辑运算放客户端的,用户分分钟给你破解掉,改改金币,刷两件装备再常见不过了。所以这一台地图服务器得验证地图内所有玩家的操作,并计算怪物AI、掉率等一系列业务逻辑。

我们可以看到,传统游戏服务器与网页服务器具有明显的区别,具有长连接、多广播、有复杂的业务逻辑、分区策略受限等独特的业务需求。

2. 咱们在来看看并发带给游戏服务器的好处是什么。

并发实际上是一种程序逻辑流程,他是不需要多核物理支持的。大致意思就是让多个独立的逻辑流看上去像是在同时跑一样。操作系统级别的并发就是多进程多线程模型。让OS处理时钟中断,i\o阻塞等等问题。

对于 服务器 而言,如果任务大部分的时间耗在i\o上,有了并发机制可以避免整个地图服务被i\o访问阻塞。一个任务阻塞的时候,把空余计算资源分配到其他任务上去。在这种情况下,并发是有益于服务器运行效率还有响应时间的。

对于程序员而言,独立的逻辑流意味着可以在一个可靠、简单、松耦合的上下文环境里面,完成自己的任务。

因为让OS处理程序逻辑切换得反复陷入内核,有的人觉得这样太慢,做了一些处于user space的线程,进程内自己控制多个逻辑流。因为语言描述能力的限制,在C/C++上面写还有用这种东西都太麻烦。于是产生了erlang, go, lua里面的coroutine语法糖。

node.js本质上也是自己控制多个逻辑流,但是这个逻辑流是根据i\o状态还有优先级分发的。在实际的实现中,它尽量采用非阻塞异步i\o,单个任务调用i\o的时候,我就停掉它,等i\o完成的信号发上来了,我再重启它。

注意这一点,每次我会运行一个任务,直到它完成或者是发生i\o调用都不会主动切换至其他的程序流。那么如果这一个任务里面涉及过于大量的计算,那么整个地图进程都会被block在这里。

而正因为node.js是异步的,所以需要不断的写回调监听i\o完成的信号。单个任务的逻辑流会多次的被打断。当任务变得相当复杂的时候,即有所谓的callbak hell,会带给调试开发非常大的麻烦。

3. 因为上面的原因,所以我不建议在非原型的MMORPG服务器开发中使用node.js。

4.最近兴起的手游服务器倒是挺适合node.js,因为手游这玩意局限于网络问题,服务器只能做关键数据验证,也没办法处理特别多人交互的情形。服务器端已经简化得跟网页服务器没啥区别了,业务逻辑也简单,处理处理数据,然后持久化就成。

Javascript 相关文章推荐
基于jQuery试卷自动排版系统
Jul 18 Javascript
关于IE BUG与字符串截取substr的解决办法
Apr 10 Javascript
用Jquery.load载入页面后样式没了页面混乱的解决方法
Oct 20 Javascript
jQuery中:visible选择器用法实例
Dec 30 Javascript
浅谈js对象属性 通过点(.) 和方括号([]) 的不同之处
Oct 29 Javascript
JS中Object对象的原型概念基础
Jan 29 Javascript
小程序组件之仿微信通讯录的实现代码
Sep 12 Javascript
微信小程序使用setData修改数组中单个对象的方法分析
Dec 30 Javascript
如何使用VuePress搭建一个类型element ui文档
Feb 14 Javascript
vue vantUI实现文件(图片、文档、视频、音频)上传(多文件)
Oct 15 Javascript
javascript实现视频弹幕效果(两个版本)
Nov 28 Javascript
VsCode里的Vue模板的实现
Aug 12 Javascript
浅析Node.js查找字符串功能
Sep 03 #Javascript
Node.js实现在目录中查找某个字符串及所在文件
Sep 03 #Javascript
iframe如何动态创建及释放其所占内存
Sep 03 #Javascript
Javascript正则控制文本框只能输入整数或浮点数
Sep 02 #Javascript
jquery制作select列表双向选择示例代码
Sep 02 #Javascript
一个获取第n个元素节点的js函数
Sep 02 #Javascript
indexOf 和 lastIndexOf 使用示例介绍
Sep 02 #Javascript
You might like
php模拟ping命令(php exec函数的使用方法)
2013/10/25 PHP
php中的curl使用入门教程和常见用法实例
2014/04/10 PHP
ThinkPHP实现动态包含文件的方法
2014/11/29 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
2016/05/23 PHP
php实现图片以base64显示的方法
2016/10/13 PHP
Javascript 判断 object 的特定类转载
2007/02/01 Javascript
JavaScript中使用typeof运算符需要注意的几个坑
2014/11/08 Javascript
JavaScript SHA512&SHA256加密算法详解
2015/08/11 Javascript
JS获取checkbox的个数简单实例
2016/08/19 Javascript
json定义及jquery操作json的方法
2016/09/29 Javascript
vue router路由嵌套不显示问题的解决方法
2017/06/17 Javascript
使用Fullpage插件快速开发整屏翻页的页面
2017/09/13 Javascript
javascript 开发之网页兼容各种浏览器
2017/09/28 Javascript
jquery 获取索引值在一定范围的列表方法
2018/01/25 jQuery
mock.js模拟数据实现前后端分离
2019/07/24 Javascript
解决vue单页面多个组件嵌套监听浏览器窗口变化问题
2020/07/30 Javascript
[06:49]2018DOTA2国际邀请赛寻真——VirtusPro傲视群雄
2018/08/12 DOTA
跟老齐学Python之重回函数
2014/10/10 Python
Python中join和split用法实例
2015/04/14 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
2019/02/19 Python
Django CSRF跨站请求伪造防护过程解析
2019/07/31 Python
python 动态迁移solr数据过程解析
2019/09/04 Python
Python数据可视化:箱线图多种库画法
2019/11/06 Python
tensorflow生成多个tfrecord文件实例
2020/02/17 Python
python实现一次性封装多条sql语句(begin end)
2020/06/06 Python
基于Python爬取fofa网页端数据过程解析
2020/07/13 Python
利用CSS3实现炫酷的飞机起飞动画
2016/09/17 HTML / CSS
纽约21世纪百货官网:Century 21
2016/08/27 全球购物
Linux操作面试题
2015/02/11 面试题
在校学生职业规划范文
2014/01/08 职场文书
学校消防演习方案
2014/02/19 职场文书
交通事故和解协议书
2015/01/27 职场文书
刑事附带民事代理词
2015/05/25 职场文书
2015毕业设计工作总结
2015/07/24 职场文书
java如何实现socket连接方法封装
2021/09/25 Java/Android
Go语言入门exec的基本使用
2022/05/20 Golang