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 相关文章推荐
改进:论坛UBB代码自动插入方式
Dec 22 Javascript
JSCode all of Brower 全局屏蔽网页右键功能 具体实现
Jun 05 Javascript
用javascript将数据导入Excel示例代码
Sep 10 Javascript
AngularJS 自定义指令详解及示例代码
Aug 17 Javascript
巧用jQuery选择器提高写表单效率的方法
Aug 19 Javascript
Bootstrap CSS布局之表单
Dec 17 Javascript
JavaScript基于Dom操作实现查找、修改HTML元素的内容及属性的方法
Jan 20 Javascript
Bootstrap modal 多弹窗之叠加关闭阴影遮罩问题的解决方法
Feb 27 Javascript
jQuery实现菜单栏导航效果
Aug 15 jQuery
js 取消页面可以选中文字的功能方法
Jan 02 Javascript
Element-UI中Upload上传文件前端缓存处理示例
Feb 21 Javascript
vue使用Proxy实现双向绑定的方法示例
Mar 20 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的mssql数据库连接类实例
2014/11/28 PHP
PHP中浮点数计算比较及取整不准确的解决方法
2015/01/09 PHP
php数据访问之查询关键字
2016/05/09 PHP
Laravel源码解析之路由的使用和示例详解
2018/09/27 PHP
基于php解决json_encode中文UNICODE转码问题
2020/11/10 PHP
番茄的表单验证类代码修改版
2008/07/18 Javascript
js 在定义的时候立即执行的函数表达式(function)写法
2013/01/16 Javascript
jQuery中json对象的复制方式介绍(数组及对象)
2013/06/08 Javascript
javascript实现div的显示和隐藏的小例子
2013/06/25 Javascript
node.js中的path.sep方法使用说明
2014/12/08 Javascript
通过实例理解javascript中没有函数重载的概念
2015/06/03 Javascript
react路由配置方式详解
2017/08/07 Javascript
js replace 全局替换的操作方法
2018/06/12 Javascript
解决layui的form里的元素进行动态生成,验证失效的问题
2019/09/14 Javascript
echarts 使用formatter 修改鼠标悬浮事件信息操作
2020/07/20 Javascript
[01:14:31]Secret vs VG 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
深度剖析使用python抓取网页正文的源码
2014/06/11 Python
python3 实现的人人影视网站自动签到
2016/06/19 Python
Python程序退出方式小结
2017/12/09 Python
用Python进行简单图像识别(验证码)
2018/01/19 Python
python+splinter实现12306网站刷票并自动购票流程
2018/09/25 Python
Django中数据库的数据关系:一对一,一对多,多对多
2018/10/21 Python
python实现AES加密解密
2019/03/28 Python
Python Multiprocessing多进程 使用tqdm显示进度条的实现
2019/08/13 Python
Python3连接Mysql8.0遇到的问题及处理步骤
2020/02/17 Python
python如何求100以内的素数
2020/05/27 Python
Python SMTP配置参数并发送邮件
2020/06/16 Python
Pytorch 卷积中的 Input Shape用法
2020/06/29 Python
python 多进程和协程配合使用写入数据
2020/10/30 Python
使用HTML5的File实现base64和图片的互转
2013/08/01 HTML / CSS
安全生产检查通报
2014/01/29 职场文书
舞蹈比赛获奖感言
2014/02/04 职场文书
cf收人广告词大全
2014/03/14 职场文书
团代会邀请函
2015/02/02 职场文书
财务经理岗位职责范本
2015/04/08 职场文书
Golang 语言控制并发 Goroutine的方法
2021/06/30 Golang