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 相关文章推荐
YUI 读码日记之 YAHOO.lang.is*
Mar 22 Javascript
javascript Split方法,indexOf方法、lastIndexOf 方法和substring 方法
Mar 21 Javascript
动态调用CSS文件的JS代码
Jul 29 Javascript
jQuery中live方法的重复绑定说明
Oct 21 Javascript
JS实现标签页效果(配合css)
Apr 03 Javascript
快速掌握Node.js模块封装及使用
Mar 21 Javascript
jquery siblings获取同辈元素用法实例分析
Jul 25 Javascript
js无提示关闭浏览器窗口的两种方法分析
Nov 06 Javascript
AngularJS使用ng-repeat和ng-if实现数据的删选显示效果示例【适用于表单数据的显示】
Dec 13 Javascript
AngularJS监听路由变化的方法
Mar 07 Javascript
深入浅析AngularJS中的一次性数据绑定 (bindonce)
May 11 Javascript
JavaScript面向对象的程序设计(犯迷糊的小羊)
May 27 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/03/21 PHP
深入解析php之apc
2013/05/15 PHP
PHP实现取得HTTP请求的原文
2014/08/18 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
JS面向对象编程 for Cookie
2010/09/19 Javascript
实现动画效果核心方式的js代码
2013/09/27 Javascript
jQuery $.each遍历对象、数组用法实例
2015/04/16 Javascript
JavaScript实现99乘法表及隔行变色实例代码
2016/02/24 Javascript
js实现密码强度检测【附示例】
2016/03/30 Javascript
易被忽视的js事件问题总结
2016/05/14 Javascript
Vue.js中用webpack合并打包多个组件并实现按需加载
2017/02/17 Javascript
javascript 取小数点后几位几种方法总结
2017/08/02 Javascript
webpack打包react项目的实现方法
2018/06/21 Javascript
解决vuejs项目里css引用背景图片不能显示的问题
2018/09/13 Javascript
JavaScript学习笔记之数组基本操作示例
2019/01/09 Javascript
对layui中的onevent 和event的使用详解
2019/09/06 Javascript
Servlet返回的数据js解析2种方法
2019/12/12 Javascript
vuex(vue状态管理)的特殊应用案例分享
2020/03/03 Javascript
javascript中正则表达式语法详解
2020/08/07 Javascript
浅析JavaScript 函数柯里化
2020/09/08 Javascript
利用selenium 3.7和python3添加cookie模拟登陆的实现
2017/11/20 Python
Python判断一个三位数是否为水仙花数的示例
2018/11/13 Python
解决新django中的path不能使用正则表达式的问题
2018/12/18 Python
python与C、C++混编的四种方式(小结)
2019/07/15 Python
Python3远程监控程序的实现方法
2019/07/15 Python
Pandas之groupby( )用法笔记小结
2019/07/23 Python
Python从文件中读取指定的行以及在文件指定位置写入
2019/09/06 Python
Pandas+Matplotlib 箱式图异常值分析示例
2019/12/09 Python
Python中实现一行拆多行和多行并一行的示例代码
2020/09/06 Python
董事长岗位职责
2013/11/30 职场文书
竟聘演讲稿范文
2013/12/31 职场文书
2014年平安夜寄语
2014/12/08 职场文书
Nginx工作原理和优化总结。
2021/04/02 Servers
浅谈pytorch中的dropout的概率p
2021/05/27 Python
浅谈Python从全局与局部变量到装饰器的相关知识
2021/06/21 Python
解决spring.thymeleaf.cache=false不起作用的问题
2022/06/10 Java/Android