美文网首页
Unity包体压缩之——字体压缩记录

Unity包体压缩之——字体压缩记录

作者: CZKGO | 来源:发表于2024-12-16 10:49 被阅读0次

小小的字体竟让占这么多资源,不得不处理下

1.字体为什么这么大?

字符集丰富:一些字体包含了多种语言的字符集,如 Unicode 全字符集,涵盖了世界上几乎所有的文字符号,这使得字体文件体积较大。
字形复杂:具有高度艺术设计性的字体,其字形可能包含大量的细节和装饰元素,如手写体、艺术字等,这些复杂的字形需要更多的数据来描述,从而导致字体文件变大。
字体格式:TrueType 和 OpenType 格式较为常见,它们支持丰富的字体特性,如字距调整、连字等,同时也会包含字体的元数据等信息,相对来说文件会大一些。PostScript 字体格式在打印领域应用广泛,它以轮廓线的方式描述字形,对于复杂字形的描述可能会更详细,因此文件也可能较大
字重和样式丰富:一些字体家族包含多种字重(如常规、粗体、半粗体等)和样式(如斜体、下划线等),每个字重和样式都需要单独的数据来存储,这也会增加字体文件的大小。
支持高级排版功能:如果字体支持一些高级排版功能,如 OpenType 特性中的智能标点、分数形式等,也会使字体文件包含更多的信息,从而导致文件变大

2.压缩准备

从上面字体大的原因开始,避免重复工作,我有以下压缩顺序考虑:
字体格式 →字重和样式丰富 →支持高级排版功能→字符集丰富→字形复杂

3.如何压缩

很好,上面已经有了压缩思路,现在开始查找压缩工具(总不会想着直接修改源文件吧!!!)
在线压缩工具

开源压缩工具

4.压缩过程记录

  1. 工具选择
    我使用了开源工具fonttools来实现压缩,选择它也是因为方便集成到我的打包流程里面。
  2. 字体格式
    我的项目中使用的字体是HYZhengYuan-95W.ttfmalgunbd.ttf,均为ttf格式,无需进行格式转换

注: 1. WOFF/WOFF2格式文件更小,unity默认是不支持的,想要使用需要自己扩展。
      2. 使用 TextMesh Pro 的话,通过Font Asset Creator 窗口生成 TextMesh Pro 专用的字体资源。

  1. 字重和样式丰富 →支持高级排版功能→字符集丰富
    针对(字重和样式丰富 →支持高级排版功能),工具已经内部处理了,黑盒操作就行,然后对于字符集,我们可以根据自己的项目来操作即可。
    列如:我项目中所使用的文本都在文件Language.txt中,包含 "en", "zh-Hans", "zh-Hant", "ru", "ko", "ja", "vi", "id"八种
  • 第一步,拆分Language.txtLanguage_h.txtLanguage_m.txt
    我的项目中malgunbd字体用于越南语和韩语,其他语言用HYZhengYuan-95W字体,所以先一步将字符集拆分。
  • 第二步,使用字符集裁剪字体
fonttools subset "malgunbd.ttf" --text-file="Language_m.txt" --output-file="malgunbd_sub.ttf"
fonttools subset "HYZhengYuan-95W.ttf" --text-file="Language_h.txt" --output-file="HYZhengYuan-95W_sub.ttf"

4.HYZhengYuan-95W.ttf裁剪失败

我在裁剪字体HYZhengYuan-95W.ttf时,遇到了如下报错

PS C:\Users\heiyi\U3D\vim_sheep_tg\Client\Assets\Font> fonttools subset "HYZhengYuan-95W.ttf" --text-file="Language_h.txt" --output-file="HYZhengYuan-95W_sub.ttf"
Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "C:\Users\heiyi\AppData\Local\Programs\Python\Python312\Scripts\fonttools.exe\__main__.py", line 7, in <module>
  File "C:\Users\heiyi\AppData\Local\Programs\Python\Python312\Lib\site-packages\fontTools\__main__.py", line 31, in main
    runpy.run_module(mod, run_name="__main__")
  File "<frozen runpy>", line 229, in run_module
  File "<frozen runpy>", line 88, in _run_code
  File "C:\Users\heiyi\AppData\Local\Programs\Python\Python312\Lib\site-packages\fontTools\subset\__main__.py", line 6, in <module>
    sys.exit(main())
             ^^^^^^
  File "C:\Users\heiyi\AppData\Local\Programs\Python\Python312\Lib\site-packages\fontTools\misc\loggingTools.py", line 375, in wrapper
    return func(*args, **kwds)
           ^^^^^^^^^^^^^^^^^^^
  File "C:\Users\heiyi\AppData\Local\Programs\Python\Python312\Lib\site-packages\fontTools\subset\__init__.py", line 3813, in main
    subsetter.subset(font)
  File "C:\Users\heiyi\AppData\Local\Programs\Python\Python312\Lib\site-packages\fontTools\subset\__init__.py", line 3601, in subset
    self._prune_post_subset(font)
  File "C:\Users\heiyi\AppData\Local\Programs\Python\Python312\Lib\site-packages\fontTools\subset\__init__.py", line 3584, in _prune_post_subset
    retain = table.prune_post_subset(font, self.options)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\heiyi\AppData\Local\Programs\Python\Python312\Lib\site-packages\fontTools\subset\__init__.py", line 2865, in prune_post_subset
    v.trim(remove_hinting=remove_hinting)
  File "C:\Users\heiyi\AppData\Local\Programs\Python\Python312\Lib\site-packages\fontTools\ttLib\tables\_g_l_y_f.py", line 1395, in trim
    flag = data[i]
           ~~~~^^^
IndexError: bytearray index out of range

这个字体我之前修改过行间距,导致工具fonttools识别时报错,所以需要先修复

  • 使用fonttools本身提供的TTX工具,可以将字体文件转换为 XML 格式
ttx HYZhengYuan-95W.ttf
  • 然后再转换回来
 ttx -o HYZhengYuan-95W.ttf HYZhengYuan-95W.ttx
  • 最后重新执行裁剪,大功告成
fonttools subset "HYZhengYuan-95W.ttf" --text-file="Language_h.txt" --output-file="HYZhengYuan-95W_sub.ttf"

5.结果展示


从开始的16.52MB到现在的235.62KB,结果压缩了98.607%,amazing!

相关文章

网友评论

      本文标题:Unity包体压缩之——字体压缩记录

      本文链接:https://www.haomeiwen.com/subject/yhgnsjtx.html