你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
输入关键字进行搜索
搜索:
没有找到相关结果
Laya_z
赞同来自:
(๑•ั็ω•็ั๑)
130*****786
layabox
1706752429用户
要回复问题请先登录
5 个回复
Laya_z
赞同来自:
(๑•ั็ω•็ั๑)
赞同来自:
130*****786
赞同来自:
layabox
赞同来自:
1706752429用户
赞同来自:
w0 = (strWidth + margin + margin) * this.fontScaleX
如下图:
然后判断该文本的宽度是否越界(宽度大于TextRender.atlasWidth),即上图中的isotex。
在TextRender.getCharRenderInfo中,如果该文本的宽度没有越界,会计算文本小图数据imgdt,如下图:
在CharRender_Canvas.getCharBmp中,imgdt的宽度的计算如下:
w1 = Math.ceil((cri.width + lineWidth * 2) * this.lastScaleX)
如下图:
之后会根据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是否越界。如果越界,同下处理即可: