Skip to content

Conversation

labbbirder
Copy link

@labbbirder labbbirder commented Jul 11, 2025

特性介绍

使用TMP字体时,如果字形找不到,则从本机系统字体中查找并渲染,类似Dynamic OS

已在以下平台通过测试:

  • Windows
  • Mac
  • Android
  • iOS

效果对比

当输入“风调雨顺 龙行龘龘 前程朤朤”时

应用此特性前:
screenshot_2025-07-11_20-37-15
应用此特性后:
screenshot_2025-07-11_16-46-16
红色框选区域为使用系统字渲染的结果

实现方式

在UIConfig中指定systemFontFamily,默认已经提供了常用的系统字,覆盖Windows、Android、iOS。参数中可以指定多个字体名,使用逗号、分号或换行符分割。

每个字体名优先匹配FamilyName+SubfamilyName(StyleName)(注意不是FullName),再匹配FamilyName。如:Microsoft YaHei能匹配任意样式的微软雅黑(通常匹配结果为Regular),Microsoft YaHei Bold能匹配加粗的微软雅黑。

screenshot_2025-07-11_20-37-40

内部机制

引用的系统字不会嵌入到安装包中,因此能有效减少包体大小,并且有更低的字体侵权风险。

运行时,当一个字形无法识别时,从第一个匹配的系统字体路径开始尝试,如果系统字体未加载,则先加载系统字体资源,如果系统字体成功识别了字符,则结束查找,后续列表中的系统字体不会继续载入到内存中。

block-beta
  columns 2
  font1 space
  font2 space
  font3 pointer<["最后一个识别了字符的字体"]>(left)
  font4["font4(未加载)"] space
  font5["font5(未加载)"] space
  style font4 stroke-dasharray: 5 5
  style font5 stroke-dasharray: 5 5

Loading

限制

WebGL平台无法应用此特性,鉴于WebGL受限的文件系统,系统字体的查找和加载环境支持不足。值得一提的是,使用queryLocalFonts时,存在两个问题:

  1. API需要用户授权,且浏览器覆盖率较低。
  2. 接口无法提供langId,导致字体名的获取结果不规范,参考

参考

https://learn.microsoft.com/en-us/typography/opentype/spec/
https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6name.html
https://learn.microsoft.com/en-us/windows/win32/intl/code-page-identifiers
https://docs.unity3d.com/2022.3/Documentation/Manual/class-Font.html
https://wicg.github.io/local-font-access

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant