v1.7 JSB 2.0 支持讨论帖

背景

在 v1.7 内测版发布帖中

http://forum.cocos.com/t/cocos-creator-v1-7-0/51658/

大家应该已经注意到了,我们在这个版本中更新了 JSB 2.0 的底层实现,得益于此,v1.7 在 iOS 平台的性能将得到大幅度的优化,同时,安卓平台的稳定性也更好。具体的性能表现可以看看 @colinsusie 的测试帖:

http://forum.cocos.com/t/creator1-7/51536

JSB 2.0

专门开这个帖子是希望能给大家普及一下 JSB 2.0 的一些背景知识,同时鼓励发布原生版本的用户都去尝试一下 v1.7 内侧版本,如果发现任何问题,在这里或者内测版发布帖都可以跟我们反馈。

首先,Cocos Creator 原生平台的基础架构和 Cocos2d-x 一脉相承,虽然使用了不同的仓库,但是框架上是没变化的:在 Cocos2d-x C++ 引擎的基础上,通过 JS Virtual Machine 来支持 JS 脚本的执行,同时通过 JSB 绑定技术暴露 C++ API 到 JS 层使得 JS 代码可以调用引擎 API。

在 v1.6 以及之前版本中,Cocos Creator 一直使用 Spidermonkey 作为内置的 JS VM,并且一直直接使用 Spidermonkey 的 API 来实现绑定层代码。这点在 v1.7 中发生了重大的改变,我们将内置的 JS VM 切换为 V8 以及 JavaScriptCore(JSC),根据发布平台自动切换,并且抽象统一了绑定层的 API,让不同的 JS VM 可以无缝切换。

(如果有人不清楚这三者的区别,Spidermonkey 是 Firefox 中的 JS VM,V8 是 Chrome 的,JSC 是 Safari 的)

Cocos Creator v1.7 JSB 2.0 架构图

如图中所示,v1.7 中,发布 Windows, Android 平台的时候我们将自动使用 V8 作为底层 JS 引擎,发布 iOS Mac OS X 的时候将使用 JSC。另外,图中的 Abstract Binding APIs 就是我们抽象的绑定层 API,所有的绑定代码都基于这套 API 来实现,与实际用哪种 JS 引擎没有关系。

优势

在这样的重构之后,我们获得了很多前所未有的优势:

  1. JSC 是苹果的亲儿子,支持基础的 JIT,性能远高于 Spidermonkey(V8 无法关闭 JIT 所以无法用于 iOS)
  2. JSC 是 iOS 提供的系统库,游戏包中将不再包含 JS VM,缩小包体
  3. V8 以及 JSC 的垃圾回收机制都比 Spidermonkey 更稳定高效
  4. 抽象出统一的绑定层 API 之后,不仅抹平了不同 JS 引擎的差异,而且升级 JS 引擎的时候不会再影响到用户代码,用户可以无负担享受 JS 引擎不停升级带来的性能优化(V8, JSC 等 JS 引擎的迭代更新非常快)
  5. 学习 JSB 绑定技术不再需要依赖 Spidermonkey 或任何一个 JS 引擎的 C++ API 了(JS 引擎升级版本过程中 API 变动非常频繁),只要熟悉我们的绑定层 API 即可工作,我们也会尽可能保障绑定层 API 的稳定

总的来说,这种架构将是未来很长一段时间內 Creator 原生引擎的根基,支持我们快速得迭代引擎功能,稳步提升引擎质量。

绑定层 API 文档

https://github.com/cocos-creator/cocos2d-x-lite/blob/develop/cocos/scripting/js-bindings/docs/JSB2.0-learning-zh.md

测试注意事项

我建议原生项目都尝试升级到 v1.7,当然,目前仍然是内测版本,如果测试过程中遇到任何问题,我们都会尽全力解决

需要注意的是,如果你之前的项目有做过原生引擎定制,或者自己生成过绑定代码,需要仔细阅读下上面的绑定层 API 文档,使用工具重新生成绑定,或者重写手动绑定代码。

遇到任何问题,请回复此帖或者内测版发布帖,我和 @dumganhar 都会尽力处理

最后,愿意帮助我们测试的,麻烦移步内测版发布帖下载(今天内应该会出 beta 2),感激不尽!

7赞

我的mac本安装1.7,运行官方的例子也报错,creator模拟器无法运行任何项目,web浏览器可以运行,和之前的任意版本安装的过程一样。
ERROR: SyntaxError: Unexpected token ‘…’. Expected a parameter pattern or a ‘)’ in parameter list., location: script/jsb_prepare.js:132:Simulator: ERROR: SyntaxError: Unexpected token ‘=’. Expected a ‘)’ or a ‘,’ after a parameter declaration., location: script/jsb_cocos2d.js:598:8Simulator: ERROR: SyntaxError: Unexpected token ‘…’. Expected a parameter pattern or a ‘)’ in parameter list., location: script/jsb_create_apis.js:296:8Simulator: ERROR: SyntaxError: Unexpected token ‘…’. Expected a parameter pattern or a ‘)’ in parameter list., location: script/jsb_opengl.js:356:8Simulator: ERROR

1.7 时开箱即用 新的jsb2.0引擎的吗?

6,等发布

如果你没有定制过原生引擎,应该是开箱即用的

模拟器的问题 @dumganhar 麻烦看下

你可以先尝试用 link 或者 default 模版发布项目,然后看看能否在 Xcode 中编译运行

太好了,坐等beta2!~ beta1的时候,打开1.6.2 beta3项目的时候,又有很多红色报错。还没有来得及换~

你的mac系统是不是太低了?因为mac上用JavaScriptCore是系统自带的,之前一个同事也碰到类似的问题,升级一下系统就没事了。应该是JavaScriptCore支持的特性缺失导致的。

跟Egret Native比怎么样?

非开源的 Egret Native 只是个玩具

2赞

这话我喜欢

支持 JSB2.0 !!! Panda大神威武 :heart_eyes:

太强大啦,这么浩大的工程竟然这么快就来了!!!

看起来很牛逼的样子

性能是永恒的追求。
还希望完善native调试。

我的mac版本是10.11.6

嗯, native无法调试的话, 没法升到1.7, 连1.6都没升, 一直1.5呢.
请尽快支持调试.

  1. JSC 是苹果的亲儿子,内部支持 JIT,性能提升立竿见影

jsc不能使用jit,参考:谁偷了我的热更新?Mono,JIT,iOS苹果为何又如何在 iOS 上禁止 Safari 之外的应用使用 Nitro JIT 编译?

哈哈,被抓住了,实际上根据测试,iOS 的 JSC 性能仍然差距安卓很远。 不过相比 1.6,已经是成倍的提升了。
另外,那个回答有点早了,我记得后来的 WKWebView,是支持 JIT 的。也就是说如果我们在 iOS 上做一个基于
WKWebView 的 webview 直接跑 H5 游戏,说不定性能更快。

JavaScriptCore的JIT分几个层级,最初级的JIT在iOS上是启用的,所以才能比SpiderMonkey的纯字节码运行效率高出5倍。
这个是可以确认的。JavaScriptCore的高级别的JIT优化是被禁用的。

说白了,iOS上自带JavaScriptCore是一个支持最基础JIT的阉割版。

从来就只有default模板成功过。