cocos creator 2.1 文本渲染分析。为啥创建Label性能差?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cocos creator 2.1 文本渲染分析。为啥创建Label性能差?相关的知识,希望对你有一定的参考价值。

参考技术A

拿 creator 制作了个排行榜页面,不到20个Item,一个Item里只有两个 Label :名称和关卡。
发现在微信小游戏中打开,会卡顿。 对页面的创建过程计时,发现主要耗时在创建 Label 上。遂来分析下 cocos creator 2.1 的文本渲染流程。
感叹下,能看到源码真是太好了~~
求教,厦门有什么好的游戏开发的交流渠道呀,群也大都死水一潭,现实中也找不到交流的同好和空间。感觉太封闭了
回归正题...

cocos creator 的文本渲染有两种:

其中采用系统字体的,应该也是归属于 ttf 中。
涉及到的文件有:

还有其他相关的文件也是跟文本渲染相关,但是本文聚焦在 2d 、 webgl 和 ttf 渲染上,其他的就略过。

Label组件作为属性的容器,并在属性变更时,调用 _updateRenderData
Label的 _assembler 的定义在 core/renderer/webgl/label/index.js 找到
根据类型,找到 _assembler 的实现在 core/renderer/webgl/label/2d/ttf.js 中
core/renderer/webgl/label/2d/ttf.js 继承了 core/renderer/utils/label/ttf.js

通过 _getAssemblerData 可知,所有的 Label 组件共享同一个 canvs 元素

updateRenderData 做实际的文本计算(字体、宽高、基线等),并绘制纹理。

_updateTexture 首先清空 canvas (注意,此canvas全局唯一,所有TTF Label共享的)
然后绘制描边,绘制文本,有需要的话,绘制下划线,最后调用 _texture.handleLoadedTexture 将 canvas 提交到 gpu 纹理上。

以上可知,每个 Label 的创建,都要经历清空重绘 canvas ,然后提交纹理的步骤。每个 Label 的纹理都是单独的,并没有重用。
当时在微信小游戏上测试,平均创建一个 Label 耗时约30ms,创建十几二十个 Label ,感知到明显的卡顿。 最终弃用ttf label,改用 bmfont label避开这个问题。感觉这里有优化的空间?

一直以来,好奇 cocos creator 的描边实现,自己一直往 shader 那边,什么纹理扩边,卷积啥的去想。
实际上:
在文件 core/renderer/utils/label/ttf.js 第255行:

cocos creator锚点分析

参考技术A 锚点(Anchor) 是节点的另一个重要属性,它决定了节点以自身约束框中的哪一个点作为整个节点的位置。我们选中节点后看到变换工具出现的位置就是节点的锚点位置。
1.锚点由 anchorX 和 anchorY 两个值表示,它们是通过节点尺寸计算锚点位置的乘数因子,范围都是 0 ~ 1 之间。(0.5, 0.5) 表示锚点位于节点长度乘 0.5 和宽度乘 0.5 的地方,即节点的中心。

2.锚点属性设为 (0, 0) 时,锚点位于节点本地坐标系的初始原点位置,也就是节点约束框的左下角。

3.锚点属性设为 (1, 1) 时,锚点位于节点本地坐标系的右上角。

同理,锚点在其他位置是,直接在该位置画坐标系即可知道节点A下节点B的位置。

4.如果改变节点锚点时,会以原来锚点原点为标准。

以上就是对creator锚点的分析,不知道各位看懂了木有。。。

以上是关于cocos creator 2.1 文本渲染分析。为啥创建Label性能差?的主要内容,如果未能解决你的问题,请参考以下文章

cocos creator 如何加载一张图片并渲染出来的

cocos creator 虚拟列表

cocos creator图集资源Atlas的创建与引用

cocos creator锚点分析

cocos creator 2.1版本Material材质系统解析

cocos creator 聊天气泡