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 相关文章推荐
用Javascript实现Sleep暂停功能代码
Sep 03 Javascript
JQuery live函数
Dec 24 Javascript
分享2个jQuery插件--jquery.fileupload与artdialog
Dec 26 Javascript
JavaScript监听文本框回车事件并过滤文本框空格的方法
Apr 16 Javascript
jQuery的bind()方法使用详解
Jul 15 Javascript
判断JS对象是否拥有某属性的方法推荐
May 12 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
Jun 28 Javascript
JavaScript中捕获与冒泡详解及实例
Feb 03 Javascript
解决React Native端口号修改的方法
Jul 28 Javascript
在vue 中使用 less的教程详解
Sep 26 Javascript
iphone刘海屏页面适配方法
May 07 Javascript
js中arguments对象的深入理解
May 14 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中长文章分页显示实现代码
2012/09/29 PHP
php计算当前程序执行时间示例
2014/04/24 PHP
php实现的Captcha验证码类实例
2014/09/22 PHP
PHP+MYSQL实现用户的增删改查
2015/03/24 PHP
PHP递归调用数组值并用其执行指定函数的方法
2015/04/01 PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
2017/07/31 PHP
关于JavaScript定义类和对象的几种方式
2010/11/09 Javascript
html+css+js实现xp window界面及有关功能
2013/03/26 Javascript
快速学习JavaScript的6个思维技巧
2015/10/13 Javascript
JS实现新浪博客左侧的Blog管理菜单效果代码
2015/10/22 Javascript
JavaScript获取图片像素颜色并转换为box-shadow显示
2016/03/11 Javascript
jQuery Ajax请求后台数据并在前台接收
2016/12/10 Javascript
Bootstrap按钮组简单实现代码
2017/03/06 Javascript
html中通过JS获取JSON数据并加载的方法
2017/11/30 Javascript
利用JS动态生成隔行换色HTML表格的两种方法
2018/10/09 Javascript
详解基于node.js的脚手架工具开发经历
2019/01/28 Javascript
layui.use模块外部使用其内部定义的js封装函数方法
2019/09/16 Javascript
javascript二维数组和对象的深拷贝与浅拷贝实例分析
2019/10/26 Javascript
vue项目出现页面空白的解决方案
2019/10/31 Javascript
利用QT写一个极简单的图形化Python闹钟程序
2015/04/07 Python
numpy.ndarray 交换多维数组(矩阵)的行/列方法
2018/08/02 Python
Python中对数组集进行按行打乱shuffle的方法
2018/11/08 Python
python实现简单的单变量线性回归方法
2018/11/08 Python
python实现递归查找某个路径下所有文件中的中文字符
2019/08/31 Python
Django中间件拦截未登录url实例详解
2019/09/03 Python
浅谈pytorch池化maxpool2D注意事项
2020/02/18 Python
python生成任意频率正弦波方式
2020/02/25 Python
python对execl 处理操作代码
2020/06/22 Python
sklearn的predict_proba使用说明
2020/06/28 Python
Bose英国官方网站:美国知名音响品牌
2020/01/26 全球购物
社会实践活动总结报告
2014/04/29 职场文书
送温暖献爱心活动总结
2014/07/08 职场文书
庆国庆国旗下讲话稿2014
2014/09/21 职场文书
工商局领导班子存在的问题整改措施思想汇报
2014/10/05 职场文书
班主任工作实习计划
2015/01/16 职场文书
python基础之文件处理知识总结
2021/05/23 Python