Cocos Creator v1.8.2 测试版发布帖(2月13日更新 rc.2)

帖子里回复的方式解决不了吗?那个修复会放到 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的代码是怎么来的?或者是怎么生成的?

http://www.cocos.com/docs/creator/advanced-topics/engine-customization.html

API 的升级,还希望文档上能同步更新,并指出影响的旧API都包括哪些。

正式发布时文档会更新的

Cocos Creator 1.8.2 测试版 控制台日志输出级别完全错误,error信息不使用红色文本,过滤选择错误时对应错误不可见

好嘞,确实是这样,这个问题我们之后会修复。

不好意思,我把基于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 这个参数,现在不需要了,传入原有函数即可

这对我来说不是一个好消息,不过这个应该可以解决。关于前面的绑定代码的内存泄漏的问题,这个怎么看?