Creator 3.3.1 在 iOS 端重复进入游戏,出现异常闪退

  • Creator 版本:3.3.1

  • 目标平台: iOS

  • 重现方式:必现

  • 首个报错:

背景

我们是在 3.0.0 RC 版本开始接入,完成新项目开发。前期遇到较多问题,在论坛和官方的支持下,通过各种方式解决了。

其中重要的一点是,我们将游戏场景放在 二级页面。比如首页都是 Feed 流,提供游戏入口,因此需要在退出游戏是,尽可能释放内存。

之前的反馈

重复进入出现闪退

问题一

2021-09-15 10:09:28.590318+0800 Supra[94400:4447792] *** -[CAMetalLayer nextDrawable]: message sent to deallocated instance 0x6000bd7878a0

在退出引擎时,出现上述错误。排查发现 Cocos Engine 在运行过程中会不断 flushMessages,清理相关内存,在相关对象被释放后,不能继续使用。需要修改 Engine 来解决

问题二

在退出游戏后,出现以下报错

* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
    frame #0: 0x00000001119844e3 Supra`cc::Application::restartVM(this=0x0000600001b43660) at Application.cpp:45:46
  * frame #1: 0x000000011198485b Supra`cc::Application::tick(this=0x0000600001b43660) at Application.cpp:100:9
    frame #2: 0x00000001119efa73 Supra`-[MyTimer renderScene:](self=0x0000600001538d40, _cmd="renderScene:", sender=0x0000600001662eb0) at Application-ios.mm:86:11
    frame #3: 0x00007fff287c80a4 QuartzCore`CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) + 914
    frame #4: 0x00007fff288bf828 QuartzCore`display_timer_callback(__CFMachPort*, void*, long, void*) + 393
    frame #5: 0x00007fff2033670d CoreFoundation`__CFMachPortPerform + 157
    frame #6: 0x00007fff2036a6f1 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 41
    frame #7: 0x00007fff20369abe CoreFoundation`__CFRunLoopDoSource1 + 607
    frame #8: 0x00007fff20363ff8 CoreFoundation`__CFRunLoopRun + 2578
    frame #9: 0x00007fff20363103 CoreFoundation`CFRunLoopRunSpecific + 567
    frame #10: 0x00007fff2c851cd3 GraphicsServices`GSEventRunModal + 139
    frame #11: 0x00007fff24ffbe63 UIKitCore`-[UIApplication _run] + 928
    frame #12: 0x00007fff25000a53 UIKitCore`UIApplicationMain + 101
    frame #13: 0x000000010e59615d Supra`main at main.swift:29:5
    frame #14: 0x0000000119775e1e dyld_sim`start_sim + 10

希望官方同学能够支持下,感谢

模型截图问题

3.0.0 其实不支持这个能力,我们是自己定制引擎实现。但升级 engine 的第一原则是,能不改引擎就不该,便于后期维护。

升级 3.3.1 后,引擎中看到 API 应该是支持的 copyTextureToBuffers

但实际调试发现,web 端正常。Native iOS 端返回全 0,猜测可能是实现有 BUG

3.3.1 在获取 Camera 的 RT 时,报错如下

jsb-adapter/jsb-engine.js:1875  unhandledRejectedPromise TypeError: Cannot read property 'SHADER_READONLY_OPTIMAL' of undefined

实现代码如下

class CaptureCamera extends Component {
        async captureResult(camera, fileName, width, height) {
          return await new Promise((resolve, reject) => {
            let texture = new RenderTexture();
            const colorAttachment = new gfx.ColorAttachment();
            colorAttachment.loadOp = gfx.LoadOp.LOAD;
            colorAttachment.endLayout = gfx.TextureLayout.SHADER_READONLY_OPTIMAL;
            const depthStencilAttachment = new gfx.DepthStencilAttachment();
            const passInfo = new gfx.RenderPassInfo([colorAttachment], depthStencilAttachment);
            texture.reset({
              width: width,
              height: height,
              passInfo: passInfo
            });
            camera.targetTexture = texture;
            this.scheduleOnce(() => {
              this._copyRenderTex(texture, fileName).then(res => {
                resolve(res);
                camera.targetTexture = null;
              }).catch(err => {
                reject(err);
                camera.targetTexture = null;
              });
            }, 0);
          });
        }
}

发现这个 texturelayout API 在 3.3.1 上没有了,可以帮反馈下吗?@boyue

https://docs.cocos.com/creator/3.0/api/en/enums/gfx.texturelayout-1.html#shader_readonly_optimal

RenderTexture 在 3.4 会提供 readPixels 接口

恩 感谢回复。我们目前仍按照 3.0.0 的方式定制引擎,但 engine 那边目前存在问题

具体我们还在想其他办法,如果解决不了,可能会影响整体的计划

另外想确认下,3.4.0 的发布计划是怎样的呢

搞的我现在新项目完全不敢尝试cocos,蛋疼的很

还有个问是,新增的 API 和 copyTextureToBuffers 有什么差异呢? @panda

上述 Crash 问题已解决

经过排查,发现 timer 在退出引擎后,没有释放。导致 app 销毁后,timer 内有消费野指针

你的引擎源码版本似乎和官方不一致, 是定制过吗

对的。新增了 [_timer pause],来修复退出引擎后 crash 的问题。

因为这 timer 在退出后没有释放,导致内部会访问到野指针

好的感谢反馈, 我们这边跟踪排查一下

恩恩,谢谢。这个问题官方可以帮看下吗?我们对于 OpenGL 这部分不是很熟悉,升级后出现了不符合预期的问题