TextMeshPro 基本原理(一)
1. TextMeshPro 相比较传统Text的优势在哪里1. 利用 SDF 算法减小字体放大后的锯齿感。2. 阴影、描边使用 Shader 绘制减少 DrawCall。3. 静态、动态字体混合使用兼顾内存与性能。4. Text 通过SetText方法拼接数字时无装箱无额外内存分配内部使用uint[] 和 Unicodechar[]数组缓存。原理就是把数字直接转成字符不需要装箱。SetText(string) 方法无收益TMP没有额外处理。5. 动态扩容小于1024长度时以2的次幂扩容超过后线性扩容每次扩容256节省空间6. 内容缩短时延迟回收顶点塌缩成一个点形成一个没有面积的三角形GPU默认忽略下次可以重新复用。2. 纹素与像素3. SDF VS 传统位图SDFSigned Distance Field符号距离场通过 TMP Font Asset Creator 编辑器创建字体。TMP渲染文字步骤1. TMP 通过 SDF 算法生成字体图集图集中存储的是纹素到字体轮廓的距离负值为字体内部0 为字体边缘正值字体外部。该信息在打包前就已经生成好了。2. 当渲染字体是比如A先从字体.asset里面找到对应的Unicode码再找到对应的glyph table对应的UV 和字符所占的宽高然后shader中去字体atlas里面找到对应UV的距离信息。3. 通过双线性差值动态计算该纹素所覆盖的像素的alpha值它相对传统的位图alpha是连续的所以生成的文字边缘比较锐利。4.假设文字放大5倍单个纹素里面包含的像素扩大5*5倍传统位图每个纹素里面像素的alpha值都是固定的所以相邻纹素之间有锯齿状而TMP根据距离对单个纹素里面像素的alpha进行差值像素过渡更自然锯齿状更小4. 动态字体、静态字体传统字体传统字体导入后Charater属性默认是DynamicDynamic 表示动态光栅化字体并生成字体图集。动态图集时默认勾选include font data 选项打包时会把对应的font字体打进包内字体集如果很大占用内存。如果不勾选则对应字体不打进包内显示文字时从Font Names选项中查找系统中对应的字体找不到则不显示。Unicode 是预烘焙所有字体支持的字体注意只烘倍对应字号的一张文字图片如果更改了字号在原字号上缩放拉伸会模糊。TMP字体通过Font Asset Creator 生成字体atlas默认静态图集生成文字时如果找不到字体会显示□如果字体的Fallback list里面有别的字体则从fallback list里面查找字体找不到则不显示。-- Fallback字体一般用同字体的Dynamic图集并勾选Muti Atlas Textures用于用户输入、聊天等字体打包规则动态字体TMP下不止要打包.asset文件同时也要把原字体打包进去。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →