02. WebApp2.0时代启程:Cocos2d-JS为什么选择SpiderMonkey(二)

紧接上文,cocos2d-JS为我们提供了图形引擎、物理引擎、JS引擎等基础库,在多终端时代提供了非常nice的游戏引擎,在浏览器普及在各个终端的今天,为什么还要单独搞一套JS引擎呢?

  1. 我们先看看使用SpiderMonkey的技术产品有哪些?

没有看错,SpiderMonkey就是FireFox浏览器的JS虚拟机(后续简称jsvm),FireFox的实力也是赢得了众多前端开发者的芳心;cocos2d-x更是不用说了,东亚97%的2D游戏开发者的选择,手游开发者的入门技能,k-3D也是在AEPIXI(我们内部实现的跨平台的js图形引擎)的3D技术的源泉,在众多新兴的图形引擎中,我们都找到SpiderMonkey的影子,为什么开发者不选择JavaScriptCore或者V8呢?

  1. 主流的JS引擎对比,SpiderMonkey vs v8 vs JavaScriptCore (vs Rhino)

a) Interpreter: 解释执行,js和java在运行时都是解释执行的一种高级语言,重要的特性之一,就是无类型untyped,比如,在执行js语句时,a = b + c;因为表达式是无类型的,js执行过程在不同的场景,可能有多种不同的含义,如:
(i)b、c都是number类型,那么+号表示数字相加,
(ii)b、c都是字符串类型,那么+号表示字符串链接
Interpreter是如何解释执行呢?
(i)从内存中读取表达式 a = b + c;
(ii)从内存中读取b、c的类型,确定操作符的含义
(iii)unbox b、c,获取真正的value
(iv)执行 b + c,(唯一有效的步骤)
(v)将结果box to x
通常如果b、c是整数,在C/C++中应该是一条指令就可以搞定,但在js中,需要更多地指令才可以完成,这里既是js的不足,也是高级语言的一些通病,场景不同,则更显神通。
JIT特性,提升JS运行速度10 ~ 100倍,又是如何提速的呢?
加载js文件时,执行预编译,将js脚本编译目标平台的机器码
(i)判断b、c的类型
(ii)执行b+c(唯一有效步骤)
(iii)写入a
可以看到JIT的运行方式缩短了js运行步骤,但不是所有场景都是可以使用jit的,比如 string + undefined,这个时候需要回归解释执行了。
b) Interpreter vs JIT,本质来说,JIT确实极大的提升了js的运行速度,从2011年之后,几乎所有的javascript引擎都开启了jit功能,(除了Android4.4.2以后,为什么呢?下一章节我们重点解读Google的密谋)

  1. JS引擎之争与安全

上图中是2014年的分析,从android4.4.2、iOS8以后,V8和JavaScriptCore分别增加了JIT的功能,android的webkit也同步了最新的Chrome的内核,然而,仍然没有开放JS引擎的插件机制(pnp)功能,理由很简单,那就是如果开启这个功能,开发者可以直接访问js的底层数据,浏览器的安全沙箱,就没有任何意义,开发者可以肆意的窥探不同网站的内部数据,谷歌和苹果怎能轻易放手?

SpiderMonkey的出现解决了这个问题,作为独立的js引擎,体积小(2.5M)、运行速度快、支持jit、pnp等特性,成为了开发的首选,虽然国内对SpiderMonkey的介绍不多,但无法阻止前端开发者对js的追求,通过简单地代码,可以让你的C++程序轻松的支持JavaScript脚本。

  1. JS的优势与弥补缺陷

JS在逻辑处理和高级语言特性方面如:闭包、函数、类型转换、Node.JS上,极大的方便了前端开发同学,又像java一样不用担心内存释放,不仅在在H5领域拥有霸主地位,近年来扩张到服务器开发、链接数据库,处理高级业务上,也大展手脚。其所见即所得的开发方式,更是让Native开发同学羡慕不已。

当然,缺陷在上面的解释执行的过程中,也暴露无遗,Native的开发方式上,不仅可以高效的执行指令,而且可以做到硬件加速,在iOS平台就有专门为矩阵运算的硬件加速,这些领域,目前还是js无法做到的。

我们是否可以把一些复杂的计算、如加解密、编解码、图像处理、浮点数、矩阵处理,用C/C++实现,并把这些API开放到JS引擎中呢?

  1. JS单线程的性能比Java要好!

我知道,只要说一句php是世界上最好的语言,马上程序员们就不淡定了。先不要慌者评价,我们看看JS和Java的虚拟机架构图

我们可以清楚的看到,Java和JS都有一个底层的跨平台的虚拟机,且都是解释执行的高级语言和GC机制,从架构上看,不同的是Java有自己的独立的内存结构,通过JNI这一层将Java的内存转换成C++内存,才可以调用底层的内核资源,而JS运行空间完全是与C++一样的内存控件,完全是C++代码在运行。

我们知道Java启动时,需要申请独立的内存控件和自己的堆栈管理,最终运行时还是会翻译成C/C++,JS在解释之后,直接交给了C++对象来处理,少了一层JNI的中介服务,必然性能会有所提升。今年来兴起的Node.JS不也是靠C/C++撑腰,才这么牛逼哄哄的嘛?

(总结)SpiderMonkey相对WebKit、Blink而言,作为一个非主流的JS的引擎,把握好了终端领域需要一个轻量级、可定制、体积小、运行快的JS虚拟机的需求下,配合移动互联网的兴起,弯道超车,在独立游戏引擎、脚本引擎领域,成了目前众多开发者的首选,是一部屌丝逆袭的励志案例。

时间: 2024-09-20 01:08:18

02. WebApp2.0时代启程:Cocos2d-JS为什么选择SpiderMonkey(二)的相关文章

01. WebApp2.0时代启程:Cocos2d-JS详解(一)

(一)WebApp时代,追求App开发效率的同时,我们也要求终端的体验和性能,2/8原则可以很好的阐述当前的hybird开发方式:20%的Native代码+80%的H5代码. (二)H5可以发挥的性能极致是什么样子? 了解这个问题,就需要知道H5的技术定位:一套H5代码支持Android.iOS.PC等多平台的前端语言,这就决定了再好的iOS平台性能,也不能忘记Android平台的用户体验:最终开发者选择了降低用户体验情况下,降低了H5的用户体验. (三)H5可以做的更好,不管是Android还

08. WebApp2.0时代启程:倒立者赢,NativePixi,所见即所得的开发方式

紧接上文,在终端设备中,不管是游戏引擎还是UIKit,图形图像都是基于跨平台的OpenGL ES技术,区分不同的场景,图形图像分为两个分支,一个以高性能的图形显示为目标的cocos2d-x引擎,一个是以省电节能适合App的UIKit框架. 一)今天我们继续逆向思维 Game VS App,既然都是基于OpenGL ES,那我们找出共同点,是否可以让二者的界限,变得更模糊?既可以满足高性能的Game引擎,可以保持App开发? 请仔细观看上图,我们的框架多了一个WebKit? 对的,我以为WebKi

05. WebApp2.0时代启程:倒立者赢,从过去到现在的变化,看将来的发展(一)

1. 移动互联网的兴起,我认为2009年是个分水岭. 开始的时候,我也是做Java开发,习惯了Webx架构,可以熟练的使用Spring.iBatis.veloctiy.HSF.Notify.Tair.Session这些阿里具有代表性的Java框架,也会使用IC.UIC.SC.DC等等服务集群做电商核心业务.概括起来,基本也是三层服务端架构: 2. 技术架构也非常稳定 后台MySQL分库分表.服务端HSF业务处理,前端浏览器使用Html做展示,技术人员的重叠率较低,公司内部资源达到了最大化价值体现

07. WebApp2.0时代启程:倒立者赢,从CPU到GPU,一张图片的旅行

紧接上文,终端开发使用的WindVane.wax.ReactNative等已经是一种跨平台的技术,我们称之为上层跨平台,Cocos2d-x这种直接使用C/C++,我们成为底层跨平台.上层跨平台,提升开发效率:下层跨平台,提升程序性能. 1. 为什么Cocos2d-x性能比Native开发要好? 因为Cocos2d-X是游戏引擎呗,人家是专业做游戏特效的好不好,直接调用GPU的OpenGL绘图的好不好.打开Cocos2d-X代码,感触最深的不是CCNode这些游戏节点,cocos2d-x已经开始为

03. WebApp2.0时代启程:Cocos2d-JS让C++代码支持JS脚本(三)

紧接上文,JS在单线程下,性能不会比Java差,注意场景是单线程.Java的优势不仅是高级语言的特性,还具备了丰富的系统内核资源,如多线程.网络等支持,要比JS灵活的多很多,这里暂时不在讨论这些问题. 回到主题,如果我们把一个完整的C++图形引擎注入到SpiderMonkey中,把复杂的预算放到C/C++内核中,而JS只作为业务处理和内存管理,是否可以获得C/C++的运行能力,有获得了良好的逻辑处理呢? 答案是肯定的!我们直入主题,我们使用最新的SpiderMonkeyV1.8.5,一起解析一下

09. WebApp2.0时代启程:倒立者赢,挑战Android性能极限

紧接上文,在终端硬件资源有限的大背景下,业务脚本+图形内核,将是未来主流的开发方式.AEPixi使用C/C++.JS.JNI.OC等混合语言开发,将pixi.js变成高性能的Native内核,提供上层pixi.js标准的API,无缝的兼容浏览器开发好的代码,实现浏览器开发,无需编译,到处运行的开发方式. 今天我们做一个H5的Demo,使用FireFox开发,开发完成之后,直接使用上一章节我们发布的android app,直接访问查看效果. 一)搭建前端开发环境 Subline Text2 / V

iOS WKWebView 混合应用开发时代来临 - 嵌入式 JS 的调试成为催化剂

iOS WKWebView 混合应用开发时代来临 - 嵌入式 JS 的调试成为催化剂 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 早在五年前,在哈尔滨大街小巷的饭馆儿里,经常听到店老板抱怨服

云2.0时代的企业混合云架构

5月26日,企业网D1net携手上海CIO联盟组织"上海CIO沙龙"活动,共同探讨了各行业新技术驱动新业务的信息化实践. 主持人:企业业务上云已是一个不争的趋势,前几年大家还在谈论是不是要上云,可是现在大家要谈论的是哪些业务要上云,上什么云,接下来我们请南凌科技产品总监殷格先生为我们带来云2.0时代的企业混合云架构的分享. 南凌科技产品总监 殷格 殷格:大家下午好,非常感谢我们主办方,感谢范总给我们这个机会能够跟大家在这么一个比较舒适的环境下产生一个全方位的链接.今天我演讲的题目是云2

Seo3.0时代 外链建设不再墨守陈规

SEO1.0是拼关键词堆砌的时代,SEO2.0大体是拼外链的时代,目前SEO已经进入3.0时代,更多的是注重用户的体验建设,外链建设不能再墨守陈规.从百度官方提出的外链算法后,SEO再也不是拼资源发外链做排名的时代,站长们要看开发新的外链形式,让外链建设脱颖而出. 外链也要注重用户体验 搜索算法更新后不再是堆积垃圾外链,外链更多的是要考虑到用户体验,哪些平台的外链既可以吸引蜘蛛爬行,又能提高用户体验,吸引用户点击链接来到站点.分析网站的潜在客户活动平台,客户需要获得哪些服务,企业给客户提供这样的