1.8.1 iOS iPad真机,切换场景时较大机率偶发崩溃

规律是,creator 用 “非调试”模式构建,然后用xcode连真机调试,重现机率很大,如果用调试模式构建目前还没能重现。

切换场景时崩溃!!!,跟这个人说的很像,不过不是已经修复了吗 ? 跟这个人说的很像

重现方式(如果好的话一直没问题,如果不好,一次必现):

  1. 场景A,跳转至场景B;
  2. 从场景B再回到场景A;
  3. 从场景A再进入场景B , 此时崩溃(画面停留在场景A)。

下面也看不懂,截个图给你 @dumganhar


1赞

能提供个 demo 吗

偶发,而且我是今天要提交appstore才发现这个问题,现在没法定位问题,写demo没思路啊。。。

看日志代码应该是在注册事件时崩溃了

因为崩溃的上一条日志下面的代码是我在场景一个常驻节点的 onLoad 中写的注册事件的代码:

大概为:

private regEvent() {
    this.xxNode.on('click',.......,this);
    this.yyNode.on('click',.......,this);
    this.zzNode.on('click',.......,this);

    this.node.on('abc', this.xxx, this);
    this.node.on('xyz', this.yyy, this);
}

@jare , @dumganhar 原因我猜是因为常驻节点的问题 !,这样猜是因为这个常驻节点是在场景 B 常驻的,从场景B回到场景A, 再进入场景B,就会有机率触发这个bug

@jare , 找到了一个获取不到场景名称的 bug,这个问题一直存在,1.6、1.7、1.8都有,之前感觉反正开发时的问题就算了,不过隐约感觉与1楼问题有关就再拿来说说(绕的有点远:grin:)。。。。

重现方式:
1、打开项目,正常在浏览器中预览运行,跳转到场景2,正常显示场景名,此步骤没问题
2、随便打开一个项目中的 prefab(demo中已经准备了一个,这个prefab可以是任意的prefab) ,Ctrl + S 保存Prefab(不管修改没修改),此时,浏览器会刷新预览,然后,bug出现: 跳转到场景2,获取到的场景名为 空。!!

关掉编辑的prefab,打开两遍场景文件,再刷新下就好了。

我等着1楼崩溃的问题解决上 appstore呢,希望尽快解决啊,谢谢 @jare

Demo 见附件:
NewProject.rar (433.2 KB)

1赞

郁闷了,只有 编译成jsb才会重现,调试模式怎么都重现不了,连日志都没法看

期待早日解决,我也是升级到1.8.1之后,遇到奔溃问题,现在都不敢上架了

莫非是XMLHttpRequest的问题? @dumganhar

每次崩溃都是在发送一个请求后
Start to load http://xxxxxxxxxxxxxxxxx
然后就崩溃了,没有 Received response from request 这条日志

因为不是调试模式,只能看到xmlhttprequest的日志

重现方式就是很快的切换场景。

应该不是请求回调方法的异常,因为这时候还没receive到返回

非常感谢这么详细的反馈,不过我用 Mac 测了一下未能重现。浏览器刷新后,我重新点击按钮,仍然能正确显示场景名。我有空会在 Windows 上测看看。

1赞

在Mac下测试也有此问题,请再试试。

别沉。。。。。。。

这个能写一个暴力测试例复现此问题么?

先修改:ScriptingCore::retainScriptObject 这个函数试试。
修改为:

void ScriptingCore::retainScriptObject(Ref* owner, Ref* target)
{
    auto iterOwner = se::NativePtrToObjectMap::find(owner);
    if (iterOwner == se::NativePtrToObjectMap::end())
    {
        return;
    }

    auto iterTarget = se::NativePtrToObjectMap::find(target);
    if (iterTarget == se::NativePtrToObjectMap::end())
    {
        return;
    }

    se::ScriptEngine::getInstance()->clearException();
    se::AutoHandleScope hs;
    iterOwner->second->attachObject(iterTarget->second);
}

这样修改后可能会导致 TileMap.getTileAt TileMap.getLayer 相关的接口出现概率性崩溃问题。
如果你没用到这两个接口,可以先这样改改。

楼主贴的崩溃问题修复:

https://github.com/cocos-creator/cocos2d-x-lite/pull/1117