经常看到群里面有人问cocos2d-js的一些原理什么的,
这里总结下自己的个人理解,分享给大家,欢迎补充或指正。
在h5(浏览器)上:
调用的是cocos2d-html5游戏引擎。引擎包对应的是在:cocos2djs/frameworks/cocos2d-html5
在native(例如手机、电脑等。注:不是用浏览器的都属于native)上:
底层调用的是cocos2d-x游戏引擎,然后在cocos2d-x上又架设了一层JSB,对应的包文件在:frameworks/js-bindings。
js-bindings里面包含了bindings,cocos2d-x,external三个文件夹
bindings : 这里面就是官方通过配合tools/bindings-generator下的clang、libclang等一系列环境,然后通过generator.py生成的cpp代码,以及其他的一些binding技术。这个模块就是传说中贼牛逼的javaScript binding技术,简称JSB,详细见底部《关于JSB》
cocos2d-x : 这个大家都懂。。
external : spidermonkey 是javaScript 语言解析引擎。这鬼东西,能在C++中运行javaScript的代码。也是cocos2d-js游戏引擎的一个重要核心。
一句话总结在native上,工作原理:
底层调用cocos2d-x,再上来一层是JSB,然后spidermonkey解析js代码,回传给JSB,JSB桥接cocos2d-x。
关于JSB:
1.JSB 有三个类型的绑定,
第一类是自动绑定代码,由bindings generator工具生成,保存在js-bindings/bindings/auto里面。
第二类是手动绑定代码,手写而成,保存在js-bindings/bindings/manual 和 script里。
第三类是纯JS的JSB功能,由于SpiderMonkey上可以执行任何纯JavaScript代码,JSB中有一部分功能实现是与Cocos2d-html5一致的,比如Object Pool等这类保存在scripts中。
小结:auto中的代码是不允许手动修改的,所有修改必须经由修改配置文件,然后重新生成自动绑定代码完成
官方人员手动修改的部分是manual绑定和scripts脚本。这部分,也是官方人员工作比较核心的一部分,工作难度较为恶心。
2. JSB,也有人叫他JSB引擎。这是一个比较容易让人混淆的概念。
一般,在native上,我们不说cocos2d-x,而会直接说在JSB上。因为JSB是直接架设在cocos2d-x之上的。
所以,如果在native上有报错的话,我们会简称在JSB上的问题。
例如:一个非常典型的错误,你的代码,在h5上可以好好的运行,但是在native上报这样一个错误:Error: Invalid Native Object
引起这个问题的一种可能,是对象被cocos2d-x内存管理机制回收了。
但是,我们一般不说在cocos2d-x报错, 而说在JSB(或者native)。
3. JSB通过SpiderMonkey的功能将Cocos2d-x绑定出可以在SpiderMonkey之上运行的JS API,并保证JS API与Cocos2d-html5 API的一致性
关于SpiderMonkey:
SpiderMonkey是Firefox的JavaScript引擎,性能比Chrome的V8还要高
它在JSB中的作用有两个:
1. 执行纯JS代码,这种情况和在浏览器中执行类似。
2. 当有API绑定注册到SpiderMonkey中时,这类JS API的调用就会被SpiderMonkey转发给C++层绑定代码,进而调用Cocos2d-x的API
注:感谢群友phpinfo() 提醒发论坛。我的错。。不要打我…