[LayaAir 2.0]游戏运行中偶现 报错 Uncaught err1

游戏运行中偶现 报错 Uncaught err1
请问这是什么原因导致的?
2925c0042a38a6f360d99ae6b2660d2.png
已邀请:

Laya_z

赞同来自:

哪个平台出现的,引擎版本是多少
请问这个问题怎么解决?

130*****786

赞同来自:

这个问题修复了吗
 

layabox

赞同来自:

需要提供重现DEMO

1706752429用户

赞同来自:

在TextRender._fast_filltext中,对于长文本会计算一个宽度:
w0 = (strWidth + margin + margin) * this.fontScaleX
如下图:
1.png

然后判断该文本的宽度是否越界(宽度大于TextRender.atlasWidth),即上图中的isotex。

在TextRender.getCharRenderInfo中,如果该文本的宽度没有越界,会计算文本小图数据imgdt,如下图:
2.png

 
在CharRender_Canvas.getCharBmp中,imgdt的宽度的计算如下:
w1 = Math.ceil((cri.width + lineWidth * 2) * this.lastScaleX)
如下图:
3.png


之后会根据imgdt的宽高,找到合适的位置把它插入某个有足够空余的文本图集(TextAtlas类)当中,即TextAtlas.getAEmpty。
需要注意的是,文本图集默认宽高都是TextRender.atlasWidth。

w0 = (strWidth + margin + margin) * this.fontScaleX
w1 = Math.ceil((cri.width + lineWidth * 2) * this.lastScaleX)
w0的strWidth等于w1的cri.width,没仔细看二者的计算逻辑但可断点调试验证;
TextRender.getCharRenderInfo中有这样一段代码:this.charRender.scale(this.fontScaleX, this.fontScaleY),所以w0的this.fontScaleX等于w1的 this.lastScaleX。
 
伪代码表示:
w0 = (文本宽度 + 边距 * 2) * 缩放
w1 = 向上取整((文本宽度 + 描边 * 2) * 缩放)
比较发现,在计算文本宽度是否超长越界时和计算文本图集宽度时的区别就是:前者使用边距,而后者使用描边;后者向上取整。
 
从抛出err1的代码处反推可知,出现err1的错误情况时,w0和w1都接近TextRender.atlasWidth,且满足w0  <  TextRender.atlasWidth,w1 >= TextRender.atlasWidth。
描边大小取决于文本的属性。在真机环境下(LayaNative),边距为0,而此时,必定存在w0 <= w1,碰巧就有可能报错。
在非真机环境下,边距为字号的1/3,一般情况下不会有问题。但是如果真的存在描边大小>=字号/3的情况,那也有可能报错。
 
优化思路1:在截图1处修改,保证w0=w1即可
margin = ILaya.Render.isConchApp ? (lineWidth | 0) : (font._size / 3 | 0)
w0 =  Math.ceil((strWidth + margin + margin) * this.fontScaleX)
 
优化思路2:在截图2处计算得到imgdt后,再判断imgdt.width是否越界。如果越界,同下处理即可:
4.png

 

要回复问题请先

商务合作
商务合作