南锋

南奔万里空,脱死锋镝余

错误对象TypeError null is not an object (evaluating 'IX.atlasName')

cocosCreator版本:3.7.2
发现这个问题很奇妙,因为在本地测试,已经测试服测试都没有出现过这个问题,只有在线上运行的时候会出现这个问题。一旦出现这个问题,就会导致整个游戏卡死,无法继续进行游戏。

错误原因

在游戏场景中使用了很多的字符图集,即将LabelCache Mode设置成了CHAR,导致生成的纹理图集过大,超过了WebGL支持的最大纹理尺寸,进而引发渲染异常或者直接奔溃。

如何确认是不是这个问题?

我们在使用浏览器预览游戏的时候,可以打开控制台,查看是否有有类似下面的问题:

1
[Warning] Font atlas texture size exceed MAX_TEXTURE_SIZE

解决方案

  1. 限制缓存图集的大小
    这个是在网上看到的方法,自己还没有具体去操作

  2. 切换LabelCache ModeNONE
    这个方法存在一定的弊端,游戏性能会下降,因为系统字体每帧都要重新绘制

  3. 切换为BitemapFont(位图字体)
    如果文字比较固定,建议使用 位图字体(BMFont):

  • 图集大小可控
  • 渲染效率高
  • 不存在缓存爆炸问题
    适用于:
  • 文本内容相对静态,或可预知的 UI。
  1. 方案四:动态 Atlas 管理优化
    可以参考官方动态合图优化:
  • 文本、图标不要全部合到一个图集里
  • 分割多个小图集
  • 动态 Atlas 开启限制图块大小和图集数量

解决方案对比

场景 建议方案
文本非常多,动态多语言 CacheMode = None
UI 固定,少量动态文本 使用 BitmapFont
中等文本量,有限制图集大小 CacheMode = Char + 限制图集尺寸
场景复杂,动态创建节点多 动态合图优化
+