cocos-engine
cocos-engine copied to clipboard
抖音小游戏 线上版本 updateUVs() 方法报错.
Cocos Creator version
3.8.3
System information
all
Issue description
错误信息: at requestAnimationFrame callback Cannot read properties of null (reading '0') 错误的调用栈:
抖音小游戏 安卓和ios都有类似错误. 同样是 我们开发者无能为力的 cocos内部错误. 且 开发环境无法重现, 微信小游戏也不存在. 只有抖音有. 涉及到的用户非常多.
看错误好像是 一个渲染组件 isValid = true (如果不是true 应该不会进入渲染流程) , 但是它的uv数据没了.
(这也不是一个新错误. 很早之前就有了, 只是当时我们没重视.)
Relevant error log output
No response
Steps to reproduce
如上
Minimal reproduction project
No response
这种没法重现,而且堆栈是不可阅读的情况下的报错没有什么意义。
这种没法重现,而且堆栈是不可阅读的情况下的报错没有什么意义。
目前我可以分析出个错误 是因为部分 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; 来做判断.
至于为什么 抖音有这个问题 微信没有. 我觉得可能是在 场景切换时 的某些时序不一致 (类似问题不止一处).
比如 这里提到的这个问题 https://github.com/cocos/cocos-engine/issues/17062 (只是用来举例 和本帖的问题无关)
A环境下 需要延迟一帧才行, B环境下不需要延迟 . 如果B延迟也没什么问题, 只是单纯的延迟了一下而已, 那么为了确保一致性, 就应该让 A B都延迟.
这个可能是你动画做的有问题
这个可能是你动画做的有问题
动画并不是总是出这个错误啊. 一般是游戏场景切换 时. spine动画还能影响cocos场景切换? 动画用第三方播放器播放也都没问题.
@minggo 我简单测试了一下 用 cc.isValid() 是ok的.