cocos2d-js 游戏引擎在各平台运行概要

经常看到群里面有人问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() 提醒发论坛。我的错。。不要打我…:5: :5: :3:

1赞

lz 我是看你的视频来的。我遇到一个问题,按照你的视频,使用cocos ide开发完游戏部分后我开始调试安卓平台部分。我使用eclipse导入native build出来的 runtime里面的proj.android和lib.cocos2dx。安装到手机上时,卡在waiting for file transfer的那个蓝色界面不动。正常情况下,这个界面是在copy资源。请教下lz该怎么弄。

这么好的帖子应该看,应该多出,应该多看!

谁告诉你的性能高,实测卡的一比,下面是具体计算时间消耗:
平台:xcode 环境:mac 3.6 GHz Intel Core i7 == cocos2d-x 3.16
js: 1000w次for循环 2.384秒
lua: 1000w次for循环 0.3秒
c++ 1000w次for循环 0.14秒