Cocos Creator v1.7.0 内测版发布帖(11月17日更新 rc.2)

用default模版或者link模版会出问题么?
你的xcode版本是?

link 没有报错; Version 9.0.1 (9A1004);
好像 Version 8.x 也出错,然后我升级到9.0.1还是报错;
现在退回到 1.62后就正常了

话说,在构建android和ios的时候,模版可选 default link 还又binary ,这个模版,是什么作用呢?

对比了下,link是不含cocos2d-x的src了而多了libs,而default的是,有代码,没有库文件~

懂了~~

选择binary,编译速度快;其它2个速度好慢要等半天

IOS版本想添加个视频功能上去,发现跟 腾讯云的互动直播 冲突了;
安卓的没问题,IOS不行

duplicate symbol _alBufferDataStaticProc in:
/Users/chenfuquan/Desktop/cocos2d/fanweqp/build/jsb-binary/frameworks/runtime-src/proj.ios_mac/fanwe/Live/Frameworks/AVSDK/QAVSDK.framework/QAVSDK(CocosDenshion.o)
/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/prebuilt/ios/libcocos2d iOS.a(CocosDenshion.o)
duplicate symbol _alcMacOSXMixerOutputRateProc in:
/Users/chenfuquan/Desktop/cocos2d/fanweqp/build/jsb-binary/frameworks/runtime-src/proj.ios_mac/fanwe/Live/Frameworks/AVSDK/QAVSDK.framework/QAVSDK(CocosDenshion.o)
/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/prebuilt/ios/libcocos2d iOS.a(CocosDenshion.o)
duplicate symbol _kCDN_AsynchLoadComplete in:
/Users/chenfuquan/Desktop/cocos2d/fanweqp/build/jsb-binary/frameworks/runtime-src/proj.ios_mac/fanwe/Live/Frameworks/AVSDK/QAVSDK.framework/QAVSDK(CocosDenshion.o)
/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/prebuilt/ios/libcocos2d iOS.a(CocosDenshion.o)
duplicate symbol _kCDN_BadAlContext in:
/Users/chenfuquan/Desktop/cocos2d/fanweqp/build/jsb-binary/frameworks/runtime-src/proj.ios_mac/fanwe/Live/Frameworks/AVSDK/QAVSDK.framework/QAVSDK(CocosDenshion.o)
/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/prebuilt/ios/libcocos2d iOS.a(CocosDenshion.o)
duplicate symbol _kCD_GainDefault in:
/Users/chenfuquan/Desktop/cocos2d/fanweqp/build/jsb-binary/frameworks/runtime-src/proj.ios_mac/fanwe/Live/Frameworks/AVSDK/QAVSDK.framework/QAVSDK(CocosDenshion.o)
/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/prebuilt/ios/libcocos2d iOS.a(CocosDenshion.o)
duplicate symbol _kCD_PanDefault in:
/Users/chenfuquan/Desktop/cocos2d/fanweqp/build/jsb-binary/frameworks/runtime-src/proj.ios_mac/fanwe/Live/Frameworks/AVSDK/QAVSDK.framework/QAVSDK(CocosDenshion.o)
/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/prebuilt/ios/libcocos2d iOS.a(CocosDenshion.o)
duplicate symbol _kCD_PanFullLeft in:
/Users/chenfuquan/Desktop/cocos2d/fanweqp/build/jsb-binary/frameworks/runtime-src/proj.ios_mac/fanwe/Live/Frameworks/AVSDK/QAVSDK.framework/QAVSDK(CocosDenshion.o)
/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/prebuilt/ios/libcocos2d iOS.a(CocosDenshion.o)
duplicate symbol _kCD_PanFullRight in:
/Users/chenfuquan/Desktop/cocos2d/fanweqp/build/jsb-binary/frameworks/runtime-src/proj.ios_mac/fanwe/Live/Frameworks/AVSDK/QAVSDK.framework/QAVSDK(CocosDenshion.o)
/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/prebuilt/ios/libcocos2d iOS.a(CocosDenshion.o)
duplicate symbol _kCD_PitchDefault in:
/Users/chenfuquan/Desktop/cocos2d/fanweqp/build/jsb-binary/frameworks/runtime-src/proj.ios_mac/fanwe/Live/Frameworks/AVSDK/QAVSDK.framework/QAVSDK(CocosDenshion.o)
/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/prebuilt/ios/libcocos2d iOS.a(CocosDenshion.o)
duplicate symbol _kCD_PitchHigherOneOctave in:
/Users/chenfuquan/Desktop/cocos2d/fanweqp/build/jsb-binary/frameworks/runtime-src/proj.ios_mac/fanwe/Live/Frameworks/AVSDK/QAVSDK.framework/QAVSDK(CocosDenshion.o)
/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/prebuilt/ios/libcocos2d iOS.a(CocosDenshion.o)
duplicate symbol _kCD_PitchLowerOneOctave in:
/Users/chenfuquan/Desktop/cocos2d/fanweqp/build/jsb-binary/frameworks/runtime-src/proj.ios_mac/fanwe/Live/Frameworks/AVSDK/QAVSDK.framework/QAVSDK(CocosDenshion.o)
/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/prebuilt/ios/libcocos2d iOS.a(CocosDenshion.o)
duplicate symbol _kCDN_AudioManagerInitialised in:
/Users/chenfuquan/Desktop/cocos2d/fanweqp/build/jsb-binary/frameworks/runtime-src/proj.ios_mac/fanwe/Live/Frameworks/AVSDK/QAVSDK.framework/QAVSDK(CDAudioManager.o)
/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/prebuilt/ios/libcocos2d iOS.a(CDAudioManager.o)
ld: 12 duplicate symbols for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

目测你这个是1.6的吧?腾讯云也用了CocosDenshion?目测只能改源码解决了。

是因为构建的时候选的是android不是ios,所以才失败的

改了 CocosDenshion、CDAudioManager 这2源文件文件,可以了; 没想到腾讯云互动直播都用了相同的代码

ccui.ListView和ccui.ScrollView都没有吗?
我用 ccui.ListView.create 和ccui.ScrollView.create 都出现
E/jswrapper (142): ERROR: Uncaught TypeError: Cannot read property ‘create’ of undefined, src/scene/MainMenuUI.js:0:0

还有小声地问一下,正式版本估计什么时候出

没有了,删除了,用creator还需要ccui下面的ListView和ScrollView么?。。。

没有看到对应的error信息啊,都是warning,这前面是否有error相关的日志?

我只是用creator下面的引擎内核, 也就是resources/cocos2d-x。
感觉1.7的引擎内核,到ccui.Widget就结束了。
我能否把1.6.1的ScrollView和ListView拿过来导出绑定接口?是否有导出工具?

ccui里面还有好多东西在1.7里面没有。你们后面会考虑加上吗?如果不考虑加上,我能否把1.6.1的相关代码搬过来,然后导出绑定?

因为我目前有个H5项目,大量用到了ccui里面的这些控件,想移植到jsb上面。

那就直接用cocos2d-js的jsb啊,不建议用creator来移植且还继续用ccui下面的非creator原生支持的控件。

我是想啊。但是ScrollView和ListView的addClickEventListener的回调函数,新内存模型时,在垃圾回收时“感觉”被清掉了。这个问题困扰了我好久,一直找不到解决方案。本想看看1.7有没有此问题,但发现1.7去掉了ScrollView和ListView。尝试过3.13, 3.15, creator的1.6.1, 都发现有问题,只是表现出来的现象不一样罢了,要么崩溃,要么就是什么 null is not a function。旧内存模型却没有问题。我后来在1.6.1下调试过那段代码,确实那个函数在gc时, proxy->obj被置为了null, 可能的解释是弱引用,但百思不得其解。

那就继续用cocos2d-js旧的内存模型。
要使用creator,就用creator控件来重写你旧游戏的UI,然后再测试一下。

找到原因了,十分隐晦。

cocos creator 1.6.1中,js_cocos2dx_ui_ScrollView_create函数代码改成

bool js_cocos2dx_ui_ScrollView_create(JSContext *cx, uint32_t argc, JS::Value *vp)
{
    JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
    bool ok = true; CC_UNUSED_PARAM(ok);
    if (argc == 0) {

		auto ret = new cocos2d::ui::ScrollView();
		ret->init();
		ret->autorelease();

		JS::RootedObject jsret(cx);
		JS::RootedObject proto(cx, jsb_cocos2d_ui_ScrollView_prototype->get());
		jsb_ref_autoreleased_create_jsobject(cx, ret, jsb_cocos2d_ui_ScrollView_class, proto, &jsret, "cocos2d::ui::ScrollView");

		cocos2d::ui::Layout* innerContainer = ret->getInnerContainer();
		innerContainer->retain();
		JS::RootedObject jsInnerContainer(cx);
		js_get_or_create_jsobject<cocos2d::ui::Layout>(cx, (cocos2d::ui::Layout*)innerContainer, &jsInnerContainer);
		ret->removeProtectedChild(innerContainer, false);
		ret->addProtectedChild(innerContainer, 1, 1);
		innerContainer->release();

		args.rval().set(JS::ObjectOrNullValue(jsret));
        return true;
    }
    JS_ReportErrorUTF8(cx, "js_cocos2dx_ui_ScrollView_create : wrong number of arguments");
    return false;
}

关键原因在ScrollView和自己的_innerContainer没有建立起关系,在js层面,我不知道怎么描述。
原来的代码中的void ScrollView::initRenderer()函数:

void ScrollView::initRenderer()
{
    Layout::initRenderer();
    _innerContainer = Layout::create();
    _innerContainer->setColor(Color3B(255,255,255));
    _innerContainer->setOpacity(255);
    _innerContainer->setCascadeColorEnabled(true);
    _innerContainer->setCascadeOpacityEnabled(true);
    addProtectedChild(_innerContainer, 1, 1);
}

问题出在addProtectedChild, 再找到addProtectedChild函数代码:

void ProtectedNode::addProtectedChild(Node *child, int zOrder, int tag)
{
    .....
    this->insertProtectedChild(child, zOrder);
    .....
}

再找到insertProtectedChild函数代码:

// helper used by reorderChild & add
void ProtectedNode::insertProtectedChild(cocos2d::Node *child, int z)
{
#if CC_ENABLE_GC_FOR_NATIVE_OBJECTS
    auto sEngine = ScriptEngineManager::getInstance()->getScriptEngine();
    if (sEngine)
    {
        sEngine->retainScriptObject(this, child);
    }
#endif // CC_ENABLE_GC_FOR_NATIVE_OBJECTS
    _reorderProtectedChildDirty = true;
    _protectedChildren.pushBack(child);
    child->setLocalZOrder(z);
}

再找到retainScriptObject函数代码:

void ScriptingCore::retainScriptObject(cocos2d::Ref* owner, cocos2d::Ref* target)
{
    if (!_global)
    {
        return;
    }
    JS::RootedObject global(_cx, _global->get());
    JS::RootedObject jsbObj(_cx);
    get_or_create_js_obj(_cx, global, "jsb", &jsbObj);
    JS::RootedValue jsbVal(_cx, JS::ObjectOrNullValue(jsbObj));
    if (jsbVal.isNullOrUndefined())
    {
        return;
    }

    js_proxy_t *pOwner = jsb_get_native_proxy(owner);
    js_proxy_t *pTarget = jsb_get_native_proxy(target);
    if (!pOwner || !pTarget)
    {
        return;
    }
    JS::RootedValue valOwner(_cx, JS::ObjectOrNullValue(pOwner->obj));
    JS::RootedValue valTarget(_cx, JS::ObjectOrNullValue(pTarget->obj));
    if (valTarget.isPrimitive())
    {
        return;
    }

    JS::RootedValue retval(_cx);
    JS::AutoValueVector valArr(_cx);
    valArr.append(valOwner);
    valArr.append(valTarget);
    JS::HandleValueArray args(valArr);

    executeFunctionWithOwner(jsbVal, "registerNativeRef", args, &retval);
}

问题就在这, pOwner 和 pTarget 对象为空,所以提前返回了。其中pOwner为ScrollView对象的代理, pTarget为innerContainer的代理。

函数提前返回导致两者的依赖关系并没有建立?从而导致ScrollView和它自己的innerContainer脱节?所以innerContainer以及其下的子节点,若用到了js对象,都会面临被GC掉的可能。
这个问题具有普遍性,也是一个巨坑。不是由脚本直接创建的对象,而是C++内部直接创建的对象,都可能会面临这个问题。

上面的修正代码只是临时解决方案。真正解决这个问题的方法,应该是,所有的C++类,只要提供了脚本访问接口,在其new出来之后就应该立即创建jsb_proxy_t对象。

非常期待引擎组能够提供帮助,解决这个问题。我估计1.7也可能有此问题。

1.7是完全不一样的绑定方式。没有什么proxy的玩意。应该不存在你说的问题。

我通过注入函数的方式解决了此问题。

http://forum.cocos.com/t/topic/51972/9

请问各位大神,
关于模拟器没有的texture._glID / texture.getName() 的问题,
我是否有变通的方案可以使用?
或是否有pull request可以先让我自定引擎使用呢?

感谢

用1.7的 chorm调试android,连上了。但是 代码里的cc.log的内容 怎么没有打印出来?