发布网友 发布时间:2022-12-09 17:13
共1个回答
热心网友 时间:2023-05-09 10:48
拿 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行: