帖子里回复的方式解决不了吗?那个修复会放到 1.10
看来也是。估计我的方向有错误。我是想直接使用CocosCreator的引擎内核来移植现有的项目。但命令行 cocos new -l js 的项目编译后不能运行。
我现在的cocos2d-x 3.13.1 jsb 项目移植到creator1.8.2上,有没有什么好的建议?
我的建议就是别瞎折腾,cocos 命令行帮不上忙的,-x 也完全用不了。
重写一部分jsb_boot.js, 可以跑起来了。但真正的问题也是最大的困难,还是在于2dx和creator的API的差异上。
rc2安装时windows安装提示更新版本已安装 但是我这只安装了1.8.1正式版
安装1.8.2rc2 vs2017找不到component.cocos这个组件,提示无法安装下列ID,“component.cocos”:未找到匹配的工作负载或组件
能否告诉我jsb_polyfill.dev.js的代码是怎么来的?或者是怎么生成的?
API 的升级,还希望文档上能同步更新,并指出影响的旧API都包括哪些。
正式发布时文档会更新的
好嘞,确实是这样,这个问题我们之后会修复。
不好意思,我把基于cocos2d-x 3.13.1的项目初步移植到creator当前版本上了,主体上已经可以运行了。感觉creator本身是可以支持cocos2d-x的所有接口的,底层代码的差异其实并不大。不知道你们为什么放弃了一些接口呢。
因为我们还没做完
发现一个问题,看似调度器的问题,
js_cocos2dx_Scheduler_schedule函数并未处理参数个数为7的情况,即最后一个参数key被传入的情况,导致在unschedule的时候不能正确移除调度。
this.schedule(callback, target, interval, cc.REPEAT_FOREVER, interval, paused, key);
还有一个想不明白的地方,关于自动生成的绑定代码,如下:
static bool js_cocos2dx_MenuItem_setCallback(se::State& s)
{
cocos2d::MenuItem* cobj = (cocos2d::MenuItem*)s.nativeThisObject();
SE_PRECONDITION2(cobj, false, "js_cocos2dx_MenuItem_setCallback : Invalid Native Object");
const auto& args = s.args();
size_t argc = args.size();
CC_UNUSED bool ok = true;
if (argc == 1) {
std::function<void (cocos2d::Ref *)> arg0;
do {
if (args[0].isObject() && args[0].toObject()->isFunction())
{
se::Value jsThis(s.thisObject());
se::Value jsFunc(args[0]);
jsThis.toObject()->attachObject(jsFunc.toObject());
auto lambda = [=](cocos2d::Ref* larg0) -> void {
se::ScriptEngine::getInstance()->clearException();
se::AutoHandleScope hs;
CC_UNUSED bool ok = true;
se::ValueArray args;
args.resize(1);
ok &= native_ptr_to_seval<cocos2d::Ref>((cocos2d::Ref*)larg0, &args[0]);
se::Value rval;
se::Object* thisObj = jsThis.isObject() ? jsThis.toObject() : nullptr;
se::Object* funcObj = jsFunc.toObject();
bool succeed = funcObj->call(args, thisObj, &rval);
if (!succeed) {
se::ScriptEngine::getInstance()->clearException();
}
};
arg0 = lambda;
}
else
{
arg0 = nullptr;
}
} while(false)
;
SE_PRECONDITION2(ok, false, "js_cocos2dx_MenuItem_setCallback : Error processing arguments");
cobj->setCallback(arg0);
return true;
}
SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 1);
return false;
}
SE_BIND_FUNC(js_cocos2dx_MenuItem_setCallback)
其中代码jsThis.toObject()->attachObject(jsFunc.toObject());会导致在脚本层面,this对象会一直持有func对象,直到this对象被GC。我没有看到对应的detachObject相关逻辑。这会不会导致,我再次setCallback的时候,旧的func对象一直不会被gc,。除非this对象首先被gc。自动生成的绑定代码看似都是这样的。
如果我认为的是这样的话,那么可能会有严重的内存泄漏。
感觉引擎组已经应接不暇了。心疼你们一秒钟。
我们已经废除了 key 这个参数,现在不需要了,传入原有函数即可
这对我来说不是一个好消息,不过这个应该可以解决。关于前面的绑定代码的内存泄漏的问题,这个怎么看?