图像与设计
TextMeshPro 字体渲染优化:解决图集膨胀…
当使用 TextMeshPro 遇到内存/图集膨胀、视觉质量、CPU 性能、构建体积或多语言对齐问题时,按症状分类排查并优化字体栈与渲染设置。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
TextMeshPro 字体渲染优化:解通用
解决思路
- 先做分诊:询问用户具体症状属于内存/图集膨胀、视觉质量、CPU/性能、构建体积还是本地化/对齐问题,再对症下药。
- 字体栈模式:主字体用静态资源并烘焙所有必需字形,通过 Fallback 列表(或 TMP Settings)添加动态回退字体,动态图集大小保持在 512-1024 以限制峰值内存。
- 动态回退字体必须启用 `Clear Dynamic Data On Build`,否则编辑器测试时烘焙的字形会被打包进播放器。
- 保持主字体与回退字体的 Padding 与 Sampling Point Size 比例一致(比例 = Padding / SamplingPointSize,10% 是安全默认值),否则同一行文字笔画粗细不一致。
- 拉丁文采样点大小用 70-90,CJK 用 36-50(CJK 字形更密,较小采样仍能生成干净 SDF 并节省图集内存)。
- 将所有字体资源的 Scale 设为 1,导入的字体常带 Scale = 0.9,会破坏标准点大小计算。
- 布局锁定后关闭 AutoSize 并硬编码选定点大小,AutoSize 仅用于真正静态、随语言变化自动适配的标签。
- 世界空间文字使用 `TextMeshPro` 而非 `TextMeshProUGUI`,避免世界空间 Canvas 的开销。
- 将频繁变化的 TMP UI 元素挂到带独立 Canvas 组件的子 GameObject 下,将重建成本限制在该 Canvas 内。
- 同一字体的斜体/粗体/描边/发光变体使用 TMP 材质预设(Material Preset),而非复制字体资源。
- 创建材质预设:选中 TMP Text GameObject,在 Inspector 的 Material 区右键 Material 标题 -> Create Material Preset,重命名并调整设置,然后在 Material Preset 下拉框中选择。
- 若静态字体点大小 ≥ 72 时边缘模糊,将 Atlas Render Mode 切换为 SDF16(更高精度 SDF,略增图集内存)。
- 修复拉丁文 + CJK 同行错位:Window -> TextMeshPro -> Settings -> Import TMP Example & Extras(每项目一次);给文本对象添加 `TMP_TextInfoDebugTool` 组件;启用 ShowLines 显示升部、降部与基线;混合拉丁文 + CJK 字符串,若线条发散则调整 TMP Font Asset 的升部/降部直至对齐。
- 若导入 TMP Examples & Extras 触发无限导入循环,关闭 Unity 后重新打开,第二次导入会解决。
- 多语言构建评估 `Atlas Population Mode = Dynamic OS`(TMP 3.2.0-pre.3+):编辑器仍用项目源字体,播放器构建不包含源字体,运行时在设备上按 Family + Style 名称查找系统字体。
- CJK 推荐系统字体:Android 用 NotoSans(广泛覆盖中日韩字形);iOS 用 PingFang 处理简繁中文,iOS 对 CJK 按语言使用不同字体族,跨中日韩统一 TMP 设置时需检查回退链。
- 若 Memory Profiler 在编辑器中显示字体资源异常大,在 `.ttf`/`.ttc` 导入设置中取消勾选 `Include Font Data`,使编辑器捕获与设备一致(设备上尤其 Dynamic OS 不付此成本)。
- 若 TMP Sprite Asset 在移动端加载慢,将源纹理的 Texture Type 设为 Default(而非 Sprite),Sprite 类型会产生 TMP 不使用的子对象。
- 排查常见陷阱:不要用单个巨型动态字体覆盖所有语言;主字体与回退字体 padding 比例要一致;Scale 不要为 0.9;实时计数器不要开 AutoSize;世界空间不要用 TextMeshProUGUI;动态回退字体不要忘记 Clear Dynamic Data On Build;编辑器捕获 Memory Profiler 时注意 Include Font Data 设置;Sprite 资源源纹理不要设为 Sprite 类型。
适用边界 · 注意事项
- 不适用于 UI Toolkit 布局问题(应使用 unity-ui-toolkit 技能)。
- 不适用于非 TMP 的 uGUI 问题(应使用 unity-ui 技能)。