宕机BUG:Cocos Creator 1.6宕机

我开始怀疑另一个地方,就是onDestroy时,其实对象已经销毁,这跟C++的实现不一样,C++的release以后,只会在下一帧去销毁对象,在原理上保证了一定的安全性.但在js层,完全没有了这样一层优雅的保护,我怀疑是不是destroy以后还去调用了这个对象的API导致的宕机.其实也建议类似C++层的设计在destroy时不销毁对象,因为在destroy以后可能有些代码还在引用这个对象,而在下一帧去销毁,可以达到保护的目的,这也是C++层优良的设计之一.

先只看你这个show函数,似乎存在着一些问题。
cc.find("UI" + name)查找UI结点,只会在Scene一级查找结点,如果UI结点是Scene的孙子结点是查不到的(可以看API文档或自己测试)。而看你的参数有一个parent,也就是UI是可以作为其他结点的子结点的。这就可能会在场景中出现多个相同UI结点的情况。

这样重现这个问题:

  1. 先调用show函数:show(Bag, null, UIRoot),UIRoot是UI结点的父结点。调用完之后,创建出一个UIBag结点,并且加到UIRoot中。
  2. 过一会,你再一次调用show(Bag, null, UIRoot),这时就有问题了,因为cc.find找不到UIBag,导致cc.loader.loadRes再一次被调用,创建出了另一个UIBag,此时,UIRoot下面就有两个UIBag了。

退一步讲,如果你确保parent是scene,也有可能会出问题的,因为cc.loader.loadRes是异步的,你调了show之后并不会马上创建UIBag,如果在创建出来之前,你又一次调用了show函数(比如快速的点两下按钮),此时还是会有两个UIBag的情况。

另外代码中cc.loader.loadRes中的err这个参数没有处理,当然如果你确信不会加载不成功也可以的,只是从严谨的角度(也才符合你的风格吗:)),判断一下再主动抛错误,就可以在错误中加上更多有用的信息,也利于后面的除错。
还有一个zIndex似乎没有用到

上面可能与崩溃无关,只是从代码的逻辑上看有些问题,也有可能是因为这些问题暴露出引擎的键壮性不够。

创建出两次是可能的,但不会导致宕机,没有处理err,这里加载失败也不会宕机,都试过的.宕机根本这不是这逻辑的问题.zIndex根本无意义,这是之前本来打算用这个,后来没用就没管了.重点都不在这,逻辑写多了有些垃圾代码残留也很正常.不删除有时可能还要补回来,所以留着.

嗯,我只是看了你这个函数的一些问题,也是值得修改的。
崩溃这些还得再努力查了:)

不过我觉得你指出的是问题,是我们犯的错,应该改,有错就要承认改正.:grin:

你们的项目很成熟了吗?如果方便的话,能不能给我一下你们的项目测试看看,可以加我 QQ,100362595.

因为你这里出现了过多位置不固定的崩溃现象,我觉得很奇怪,如果是由哪些地方这么不稳定的话,理论上我们或者其他项目应该也可以普遍测试出来的,这些问题我们如果重现不了都没有办法修复,看 log 得到的信息太有限了

另外,我想问一下,是不是这些是项目上线之后收集到的崩溃现象?还是你们测试自己测出来的?大概崩溃比例是什么样?

Android的闪退是bugly上报的,苹果闪退是我自己使用中碰到的发生频率大概一天一次,有时一天都没有,有时一天两三次.我早加过你的QQ了,我只是换了个马甲:grin:,.安卓的闪退不是我亲测,我也不知道发生频率怎么样.

你的 destroy 一般是怎么写的?

onButtonBG: function () {
this.node.destroy();
},

基本都是这样写的

其实在切换场景的时候会自动 destroy 旧场景中的所有元素,你现在的操作在节点还有效的情况下做 destroy 可能有一些风险,我会尝试一下你这种方式,可能能重现问题,不过正常的流程应该是

this.node.destroy();

有没有 demo 给我们测试一下?

我这游戏到后期了,仔细看了前面的崩溃截图,跟我安卓上测试的差不多,不断切换场景的时候,偶尔会崩溃,我有时间用default打下完整的调用栈,给你看下。

哈哈,我两个空场景试过,来回切换场景大概1/20的概率会崩溃

1赞

再报一个BUG,当一些界面父结点active=false但此时它在顶层,不可见,它的子结点如果有button组件,很大概率会阻挡点击事件.

除了Logo,我们整个游戏只有一个Scene,切场景全部自己实现:wink:
依赖引擎越少,主动性越多

你们开拓了我的思路呀。能简单说下思路不?怼到一个场景主UI还是比较多的。用预制体?

我也遇到过,PC Chrome环境,遇到了没仔细看错误,现在以业务实现为重,待让业务整体写好了再仔细找这种偶发错误。

错误现象为:预览时切换场景报错,黑屏。没仔细看错误,应该是引擎加载之类的问题。

也是种思路,确实可以避免框架的一些问题,比如:肯定不会遇到常驻节点的问题 :grin:

麻烦cocos大师帮忙,确认一下,打开大的场景,然后点根属性,右边一直在转圈圈

你原来场景的结点信息这些释放不?