在我开端运用OpenAphid-Engine的时分,曾经有几品种似的iOS/Android 项目.这些贸易项目或许开源项目运用JavaScript完成代码特征。比方,Titanium 和PhoneGap 答应开辟者运用JavaScript开辟当地 iOS/Android apps; ngCore 更是可使用纯粹的JavaScript构建跨平台的游戏。JavaScript曾经成了编程言语中的佼佼者,也由于更轻易进修吸引了浩繁开辟者介入到这一范畴。
首要有两种办法。一种是运用系统的阅读器组件(IOS中的UIWebView和Android中的WebView),另外一办法就是运用整合好的JavaScript引擎。
运用系统的阅读器组件比拟轻易完成可是更庞杂,效力也低。 WebView供给了 addJavascriptInterface 把Java classes注入到JavaScript文本的办法。可是它只支撑最原始的几种数据类型,因而也局限了API设计。而且在Android 2.3模仿器上不波动,在真机上也会碰到 issue #12987的问题。在IOS上更糟 UIWebView没有公共的APIs支撑JavaScript到Objective-C的交互(你必需运用似有的APIs才干到达与addJavascriptInterface类似的功用)。
PhoneGap 是基于 UIWebView and WebView的比拟知名的项目。开辟者自愿运用回调函数从JavaScript APIs失掉前往值。这在游戏上效力极低,也更加庞杂。
早期的ngCore异样依靠UIWebView来支撑iOS。可是这个机制因为其蹩脚的表示被代替。
为了取得更好的表示、灵敏性、兼容性,嵌入全功用的JavaScript引擎变得更加有效。
|
iOS | Android |
---|---|---|
JavaScriptCore | Interpreter only | Interpreter and JIT |
SpiderMonkey | Interpreter only | Interpreter and JIT |
V8 | JIT only for jailbroken devices | JIT |
Rhino | Unsupported | Interpreter |
兼容性:同时支撑iOS 和 Android 在x86 和 ARM 平台上的 模仿器和 装备。
Rhino和 V8呈现的最早,可是不支撑iOS。我十分盼望可使用 V8开辟 OpenAphid-Engine ,在初度运用时就发明它具有优雅的代码构造,杰出的表示,可是我十分绝望,由于 V8只能在JIT形式下运用,而IOS不支撑。除非你运用jailbroken装备。(概况请参考 issue #1312)
我在JavaScriptCore和SpiderMonkey间纠结了好久。在胜利安排了Android和IOS项目后,我经过试验找到更好的一个。
SpiderMonkey 轻易失掉开辟权限,可是在与JavaScriptCore比拟时心悦诚服。SpiderMonkey发生了大量的二进制文件 (在ARMv7上约莫1.3MB);JavaScript履行得更慢,在JavaScript和C++的桥接表示更加主要。别的一个让我阔别SpiderMonkey的缘由是在iOS模仿器上呈现随机解体景象。
JavaScript引擎会受非常多工具影响,比方穿插编译器的版本、引擎的版本和操纵系统的品种等。下表罗列了几种运转在iPod Touch 4上引擎的运转工夫。(有兴味请于Google Doc检查准确的工夫)
JavaScriptCore 大比分抢先。
我没有找到SpiderMonkey,所以就运用了下面的三种自界说搭建Cocos2d-iPhone-2.1-beta4, Cocos2d-x-2.1-beta3和iMonkey。
一切测试的apps都基于LLVM 4.1版本,一切的引擎都运转在说明器形式(iOS受限)。
几种基准的引见:
1m-js_loop履行空轮回一百万次。
1m-native_function恳求挪用一百万次前往undefined的当地函数
1m-js_function跟上面一个类似,只是换成了JavaScript。
fib(30)递归的方法盘算Fibonacci(30)。
sudoku-5用这里的算法处理Sudoku问题。
1m-native_function JavaScriptCore运用可移植的C APIs完成,固然这不是最有效引入当地函数的办法。
SpiderMonkey 在台式电脑上因为初级的JIT追踪办法运转更快,可是在IOS装备上却与之相反。
在大部分的基准上,运用iMonkey比SpiderMonkey更快
很分明的,运用SpiderMonkey将会在iOS上取得更好的表示。ngCore 1.10在iOS上参加自界说功用,所以要更优于像SpiderMonkey如许的变体。
在我分心于 JavaScriptCore以后,我的研讨更进了一步:
1. 它在运转 一百万 次 native_function和 一百万次Math.abs(0) 的工夫六倍于 运用 JavaScriptCore.我察看到异样的功能问题呈现在经过注入的方法拜访工具的属性。
2. 应用 C APIs 实行设计固然开辟容易,可是缺少灵敏的内存治理机制。缺少一个初级的外部渣滓收受接管机制很难明决相似于 circular references 的问题。在开辟OpenAphid-Engine时期,我不断坚持对其他引擎的存眷,以下这个表格总结了其他JS引擎的运用状况
|
iOS | Android |
---|---|---|
ngCore 1.6 and above | UIWebView | V8 |
ngCore 1.7 and later | SpiderMonkey | V8 |
Titanium | JavaScriptCore | V8 or Rhino |
PhoneGap | UIWebView | WebView |
Cocos2D-x JavaScript | SpiderMonkey | SpiderMonkey |
CocoonJS | JavaScriptCore | JavaScriptCore |
Ejecta | JavaScriptCore | Unsupported |
directCanvas | JavaScriptCore | No clue |
我将对比 ngCore 把我本人的设法放到OpenAphid-Engine. 请等待!
本文中的一切译文仅用于进修和交换目标,转载请务必注明文章译者、出处、和本文链接。 2KB翻译任务按照 CC 协定,假如我们的任务有进犯到您的权益,请实时联络我们。2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务