![](https://img.haomeiwen.com/i5989922/03e549f391fe2494.png)
小小的字体竟让占这么多资源,不得不处理下
1.字体为什么这么大?
字符集丰富:一些字体包含了多种语言的字符集,如 Unicode 全字符集,涵盖了世界上几乎所有的文字符号,这使得字体文件体积较大。
字形复杂:具有高度艺术设计性的字体,其字形可能包含大量的细节和装饰元素,如手写体、艺术字等,这些复杂的字形需要更多的数据来描述,从而导致字体文件变大。
字体格式:TrueType 和 OpenType 格式较为常见,它们支持丰富的字体特性,如字距调整、连字等,同时也会包含字体的元数据等信息,相对来说文件会大一些。PostScript 字体格式在打印领域应用广泛,它以轮廓线的方式描述字形,对于复杂字形的描述可能会更详细,因此文件也可能较大
字重和样式丰富:一些字体家族包含多种字重(如常规、粗体、半粗体等)和样式(如斜体、下划线等),每个字重和样式都需要单独的数据来存储,这也会增加字体文件的大小。
支持高级排版功能:如果字体支持一些高级排版功能,如 OpenType 特性中的智能标点、分数形式等,也会使字体文件包含更多的信息,从而导致文件变大
2.压缩准备
从上面字体大的原因开始,避免重复工作,我有以下压缩顺序考虑:
字体格式 →字重和样式丰富 →支持高级排版功能→字符集丰富→字形复杂
3.如何压缩
很好,上面已经有了压缩思路,现在开始查找压缩工具(总不会想着直接修改源文件吧!!!)
在线压缩工具
- 字体压缩神器 www.mainww.com
开源压缩工具
4.压缩过程记录
- 工具选择
我使用了开源工具fonttools
来实现压缩,选择它也是因为方便集成到我的打包流程里面。 - 字体格式
我的项目中使用的字体是HYZhengYuan-95W.ttf
和malgunbd.ttf
,均为ttf格式,无需进行格式转换
注: 1. WOFF/WOFF2格式文件更小,unity默认是不支持的,想要使用需要自己扩展。
2. 使用 TextMesh Pro 的话,通过Font Asset Creator 窗口生成 TextMesh Pro 专用的字体资源。
- 字重和样式丰富 →支持高级排版功能→字符集丰富
针对(字重和样式丰富 →支持高级排版功能),工具已经内部处理了,黑盒操作就行,然后对于字符集,我们可以根据自己的项目来操作即可。
列如:我项目中所使用的文本都在文件Language.txt
中,包含"en", "zh-Hans", "zh-Hant", "ru", "ko", "ja", "vi", "id"
八种
- 第一步,拆分
Language.txt
为Language_h.txt
和Language_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.结果展示
![](https://img.haomeiwen.com/i5989922/42d9f52ff9a75937.png)
从开始的16.52MB到现在的235.62KB,结果压缩了98.607%,amazing!
网友评论