jsb传参问题

请问js中的Node可以传递到c++层使用吗?具体该怎样操作呢?没有找到相关资料

可以,使用绑定的话,C++ 中函数参数类型是 Node 的情况下,绑定出来的 JS 函数会自动做类型转换

如果是在js中的创建的Node对象呢?我是在编辑中添加了图层Node,然后想把这个图层Node传递到c++中来处理,在c++中进行setPosition、addChild等操作,请问这样的需求可以满足吗?

哦,我说的有点偏差,creator 中 cc.Node 是纯 JS 类型,C++ 无法处理

node._sgNode 是绑定的对象,_ccsg.Node 类型,在 C++ 中可以处理。你具体是什么需求?

我们有一个层,里面有上千个精灵,分布在地图中(屏幕同时显示可能100个以内),用js的话帧率降低得非常明显。我们分别测试了creator和纯cocos2d-x,在相同手机上:
1.creator添加了2000个屏幕外的精灵,帧率40;cocos2d-x添加35000个屏幕外的精灵,帧率:50
2.creator添加了900个屏幕内的精灵,帧率50;cocos2d-x添加4000个屏幕内的精灵,帧率:50
所以我们想在c++层处理这个有大量精灵的逻辑

关键问题在于,你的屏幕外精灵也有挂载逻辑把?我的建议是用对象池来管理所有精灵,场景中只包含屏幕内的,一旦精灵移动到屏幕外就移除,放到对象池中

感谢回复,用_sgNode可以在c++层操作该对象!

这些精灵都没有逻辑的,就是静止在场景中的;
今天我又做了一次对比测试,js中添加2000个精灵在同屏幕中,帧率降到15帧左右,而相同的代码在c++中帧率依然60左右,测试代码如下:

js:
for(let i=0; i<=2000;++i)
{
let sprite = this._createSprite();
sprite.setContentSize(200,200);
sprite.setAnchorPoint(0,0);
sprite.setPosition(cc.p(1920 * cc.random0To1(), 1080 * cc.random0To1()));
this._testLayer.addChild(sprite);
}

c++:
for (int i = 0; i < 2000; ++i)
{
auto sp = Sprite::createWithSpriteFrame(spFrame);
sp->setPosition(CCRANDOM_0_1() * 1920, CCRANDOM_0_1() * 1080);
cobjLayer->addChild(sp);
}

同时,我还发现一个问题,用纯js代码的情况下,添加大量对象在场景中:
1.web浏览器中运行帧率可以到60
2.而编译到Android平台后,帧率就下降非常明显了
3.我又发布一个web-mobile版本,用该Android手机的浏览器打开,帧率可以到55(比编译出来的apk包效率还高)
所以是不是因为js和c++的频繁交互导致帧率下降的呢

可以给一个测试项目给我么?
JS 代码和 C++ 之间的交互的确是有比较大的损耗的,你的项目中有很多这样的逻辑吗?还有就是目前 JSB 中用的 JS 引擎性能是不如最新浏览器中内核的,我们因为一些兼容性问题暂时还无法升级 JS 引擎

另外,测试性能请一定要用 release 模式编译

好的,稍等!我弄两个对比项目上来

论坛中传不上来,我放到百度盘了http://pan.baidu.com/s/1kVoL0kJ,解压密码是4321
1.TestBenchMark.zip是测试项目(其中c++部分没有传上来)
2.TestBenchMark-debug.apk是编译的包
3.test_cocos2dx34.apk是基于cocos2d-x 3.4编译出的包