3.8.1微信小游戏版本的label导致卡死问题

  • Creator 版本: 3.8.1

  • 目标平台: 微信

  • 重现方式:打包到微信后,运行游戏一段时间,大概5-10分钟左右,可重现问题。只有微信有此问题,webmobile无法重现此问题。

  • 首个报错:
    MiniProgramErrorCannot read properties of null (reading’atlasName’)TypeError: Cannot read properties of null(reading ‘atlasName’)at e.-multilineTextWrap (game.js:23:251890)at e._alignText (game.js:23:250459)at e.processingString (game.js:23:240977)at Object.updateRenderData (game.js:23:258606)at i.updateRenderer (game.js:23:107060)at e.updateAllDirtyRenderers (game.js:21:857484)at i.tick (game.js:21:868027)at r._updateCallback (game.is:21:891334)at Function.-updateCallback (game.js:21:870692)at Function.
    (WAGameSubContext.js:1:213705)

  • 之前哪个版本是正常的: 不确定

  • 手机型号: 无论手机

  • 手机浏览器: 微信小游戏

  • 编辑器操作系统: vs code

  • 重现概率: 微信100%,其他平台未能重现

出现卡死后,在cocos源码中定位到是

cocos/2d/assembler/label/text-processing.ts
中的_multilineTextWrap方法中有一段错误输出:
letterDef = shareLabelInfo.fontAtlas!.getLetterDefinitionForChar(character, shareLabelInfo);
if (!letterDef) {
this._recordPlaceholderInfo(letterIndex, character);
log(Can't find letter definition in texture atlas ${ style.fntConfig!.atlasName} for letter:${character});
continue;
}

其中的atlasName所属的style.fntConfig为null导致的,在打出的微信包中将此句报错改为Can't find letter definition in texture atlas for letter:${character}

可解决卡死问题,但会报错输出这句日志,日志中可看出部分文字无法再正常显示,都是非常常用数字等,且刚开始能正常显示的文字。

从堆栈源头看是updateAllDirtyRenderers方法导致,项目中的确用了很多label是使用char缓存模式,怀疑是这个缓存模式的问题,导致生成的临时图集不存在了?或者被回收了?但web mobile和预览无法复现此问题。
WechatIMG1109
WechatIMG1110

降引擎版本到3.7.4后,问题消失了,没办法只能放弃3.8.1了

有示例代码看看么

可以看下是不是 图集满了 ,把图集的大小改大一点image

因为项目工程有点大,暂时没有示例。

这个可以直接在引擎外部修改么?

但是理论上图集应该不会无限变大,因为所有文字就那么多,而且游戏前面运行的几分钟都没问题,只有在几分钟后,哪怕没有新的文字出来,都会出现问题。

感谢大佬,后来用spector跟踪了下,确实可能是图集满了,重新统一规划字体后,基本上可以了。

但按这个位置的源码修改了好像不能生效,看图集仍然是1024x1024,是有什么其他操作吗?

修改源码之后需要重新编译引擎,看下是否选择了自定义引擎 以及是否重新编译

好的,多谢。

我也遇到这个问题了,我的版本也是3.8.1,请问有更简单的解决方法吗?或者如何规避。官方什么时候可以修复一下?

这本来就不算是bug,应该是特性就是规定1024。要么就别用这个cache模式了。
之前乐府有一篇高级的自定义方式的文章,可以论坛搜一下

但是之前版本貌似是没有这个问题的,因为我们游戏已经上线接近3年了,如果有链接麻烦发一下

3.8 自带高清文本了吧 用char的话 会比旧版本的占用空间大一些,估计你们以前的项目的char图集就已经快满了

3.8.0的怎么解决的,我也是使用了char 缓存模式,也是报的这个错误:(C:/ProgramData/cocos/editors/Creator/3.8.0/resources/resources/3d/engine/native/cocos/bindings/jswrapper/v8/Object.cpp, 754): Invoking function failed, TypeError: Cannot read property ‘atlasName’ of null
at sD._multilineTextWrap (src/cocos-js/cc.js:1:813579)
at sD._alignText (src/cocos-js/cc.js:1:812466)
at sD.processingString (src/cocos-js/cc.js:1:803028)
at Object.updateRenderData (src/cocos-js/cc.js:1:820578)
at t.updateRenderer (src/cocos-js/cc.js:1:670110)
at Object.updateAll

小游戏还是原生?