cocos-engine icon indicating copy to clipboard operation
cocos-engine copied to clipboard

抖音小游戏 线上版本 updateUVs() 方法报错.

Open finscn opened this issue 1 year ago • 6 comments

Cocos Creator version

3.8.3

System information

all

Issue description

错误信息: at requestAnimationFrame callback Cannot read properties of null (reading '0') 错误的调用栈:

image

抖音小游戏 安卓和ios都有类似错误. 同样是 我们开发者无能为力的 cocos内部错误. 且 开发环境无法重现, 微信小游戏也不存在. 只有抖音有. 涉及到的用户非常多.

看错误好像是 一个渲染组件 isValid = true (如果不是true 应该不会进入渲染流程) , 但是它的uv数据没了.

(这也不是一个新错误. 很早之前就有了, 只是当时我们没重视.)

Relevant error log output

No response

Steps to reproduce

如上

Minimal reproduction project

No response

finscn avatar Oct 08 '24 10:10 finscn

这种没法重现,而且堆栈是不可阅读的情况下的报错没有什么意义。

minggo avatar Oct 11 '24 01:10 minggo

这种没法重现,而且堆栈是不可阅读的情况下的报错没有什么意义。

目前我可以分析出个错误 是因为部分 updateUVs (sprite: Sprite) 方法只判断了 spriteFrame 是否存在 没有判断 spriteFrame 是否有效引起的.

比如文件 cocos/2d/assembler/sprite/simple.ts :


    updateUVs (sprite: Sprite) {
        if (!sprite.spriteFrame) return;
        const renderData = sprite.renderData!;
        const vData = renderData.chunk.vb;
        const uv = sprite.spriteFrame.uv;
        vData[3] = uv[0];
        vData[4] = uv[1];
        vData[12] = uv[2];
        vData[13] = uv[3];
        vData[21] = uv[4];
        vData[22] = uv[5];
        vData[30] = uv[6];
        vData[31] = uv[7];
    },

看方法内的第一行, sprite.spriteFrame 可能不为空, 但是 sprite.spriteFrame 可能还没有初始化或者已经被销毁. uv不存在. 下面有用到 uv[0] , 也正好对应了上面报错信息里的 Cannot read properties of null (reading '0')

类似的还有 cocos/2d/assembler/sprite/sliced.ts .

希望此处的判断能够再严格些. 比如用 if (!cc.isValid(sprite.spriteFrame)) return; 来做判断.

finscn avatar Oct 11 '24 04:10 finscn

至于为什么 抖音有这个问题 微信没有. 我觉得可能是在 场景切换时 的某些时序不一致 (类似问题不止一处).

比如 这里提到的这个问题 https://github.com/cocos/cocos-engine/issues/17062 (只是用来举例 和本帖的问题无关)

A环境下 需要延迟一帧才行, B环境下不需要延迟 . 如果B延迟也没什么问题, 只是单纯的延迟了一下而已, 那么为了确保一致性, 就应该让 A B都延迟.

finscn avatar Oct 11 '24 05:10 finscn

这个可能是你动画做的有问题

longchuan avatar Oct 12 '24 15:10 longchuan

这个可能是你动画做的有问题

动画并不是总是出这个错误啊. 一般是游戏场景切换 时. spine动画还能影响cocos场景切换? 动画用第三方播放器播放也都没问题.

finscn avatar Oct 13 '24 03:10 finscn

@minggo 我简单测试了一下 用 cc.isValid() 是ok的.

finscn avatar Oct 14 '24 08:10 finscn