在 Unity 中制作游戲時對動態字體的剝離和精簡是現在常用的手段,現在有兩篇博客是大家閱讀和參照較多的,分別是 如何精簡Unity中使用的字體文件 和 FontPruner 字體精簡工具。他們各自提供了一個用於精簡字體的工具, FontSubsetGUI 和 FontPruner。前者是網絡上一個作者提供的免費軟件,現在不是很好找,后者是西山居開源的內部工具,基於 google 的 sfntly 制作。
我分別使用兩個工具裁剪同一個字體,使用同一套文本,發現結果還是有區別。字體:仿宋;大小10Mb;裁剪文本:“abcdefg0123我要喝咖啡”;裁剪后查看工具:FontCreator(試用了眾多工具后發現是最好用和專業的工具)。
使用 FontSubsetGUI 裁剪后的字體大小:182Kb,FontCreator 打開后如圖:
圖一
圖二
注意紅色線框部分,Glyphs 總共定義了 28562 個,同原始字體一樣,但是 Empty 了 28542 個,就是如上 圖一 中所有空白方快,他們都是缺失字體外形定義,但有字體符號表,也就是說有這個字但沒有定義和映射字體外形,處於不可用狀態。下面 Characters 是當前擁有的字體定義和外形,一共19個,奇怪的是多出了一個“雙引號”和一個“M”,而這一部分空的 Glphys 定義其實也是需要占空間的。
下面看 FontPruner 的裁剪結果,環境和數據都相同,裁剪后文件大小6Kb,結果如下:
圖三
圖四
如 圖三 所示,我的裁剪文本是16個,字體文件內可用的 Characters 也是16個,顯示的 Glyphs 定義是17個,其中包含一個 .notdef 系統預留的定義(圖四),值為0;也就是其余所有沒用到的 Glyphs 都被裁剪掉了,變得更加精簡,所以文件就更小。總體結果如下:
圖五
以上兩種導入到項目中使用都沒有問題,但是 FontPruner 更加精簡准確,所以我最終選擇后者集成到項目中,做一個批處理能夠自動根據設定的文本來處理所有使用的字體,也非常方便。
但是以上兩個工具都不能直接處理 otf 字體,均會報錯。在處理前建議使用 FontCreator 將 otf 轉換為 ttf 然后在處理,選擇 “File->Export Font As...->Export as TrueType/OpenType Font...” 彈出的對話框中第一個選項 “Outline Format” 一定要選擇 “TrueType”,否則即使最終在保存對話框選擇 ttf 格式后導出了也無法使用。
經過此步驟,就可以處理 otf 字體了(比如安卓默認的那一套思源字體等)。
另外,原本 FontPruner 在處理臨時路徑時有一點點小 bug,我修復提交了 pr 且已經合並了;不過每次運行裁剪命令 Temp 目錄都不會自動創建需要先手動創建好,這樣使用有點不方便,我修改成自動創建,但是沒有 pr,需要這個功能的請在這里下載:https://github.com/yaukeywang/FontPruner/tree/extend。
發現很多朋友在找 FontSubsetGUI 的下載地址,現在不是太好找了,這里給出下載地址:https://download.csdn.net/download/yaukeywang/10012038。