Unity优化中,字体大小优化是非常重要的一项。
一个包含常用汉字的ttf字库,一般在10MB以上。
直接放到安装包中的话,会造成极大地浪费。
裁剪
裁剪主要是针对ttf体做个筛选,从庞大的字库中,拣选部分我们需要的文字,然后生成一个较小的字体库。
工具方面,可以选择网上很多人推荐FontSubsetGUI和FontPruner,这个前辈写了比较详细的操作流程,两款软件各有利弊吧。也有前辈对FontSubsetGUI的字体裁剪结果提出了质疑关于字体剥离和精简工具 FontSubsetGUI 和 FontPruner 的比较。
这里我推荐一款fontsmaller,这个才是真正的极简,不用安装什么环境,操作界面都没有,双击打开,选中TTF,输入要裁剪的文本就完事了。裁剪出来的大小也比较理想。
一般情况下,这三款裁剪出来的大小差距不大,我们选取3000常用字,裁剪字体后,字体一般在4-5M。(参与过的某个项目在国外运营,只要求英文环境,也就是只需要unicode字符,裁剪后只有40Kb左右)
NGUI字体剥离(很少用)
某些项目使用的是打包方式是强制引用(BuildAssetBundleOptions.CompleteAssets),这导致多个Bundle包引用的字体被强制拉到各个Bundle中,造成大量的“冗”。(字体资源十分特殊,极易被多个Bundle引用)。
为了解决这个问题,又不造成大量的代码修改。打包时可以将每个UILabel引用的UIFont名称记录(记录到预制体上,方便复原),然后的UILabel.bitmapFont全部置为null(丢失引用后,就不打包),最后将所有引用到的字体统一存放的一个公共位置,(比如CommonModel之类的地方建一个公共字体库)。
具体界面加载时,再将字体通过名字在公共字体库中进行“查表”复原,如此便可去掉每个界面的字体“冗”
字体异常丢失问题(应急手段)
字体折腾来折腾去,打包出去发现全没了,短时间又找不到原因怎么办(把自己坑吐血)。
打包前执行下这个方法,将所有的字体全部改为动态字库。
bb is weak show u code
private static void SetFontDependence(bool contain)
{
var Fonts = AssetDatabase.FindAssets("t:Font");
int count = Fonts.Length;
for (int i = 0; i < count; ++i)
{
var path = AssetDatabase.GUIDToAssetPath(Fonts[i]);
var font = AssetImporter.GetAtPath(path) as TrueTypeFontImporter;
if (font != null)
{
font.includeFontData = contain;
}
}
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
}
关键代码是
font.includeFontData = true。具体请参考http://www.manew.com/youxizz/2926.html
If this is enabled, the actual font will be embedded into the asset for Dynamic fonts.
如果这个被启用,实际字体将嵌入到资源中,用于动态字体。
When you disable this, the user must have the font installed in his system to use it.
当这个禁用,用户必须在他的系统安装这个字体。