Unity性能优化之字体裁剪

本文详细介绍Unity中字体优化的方法,包括字体裁剪工具的选择与使用,如fontsmaller、FontSubsetGUI和FontPruner,以及如何解决字体异常丢失问题。通过裁剪字体库,可以显著减小安装包体积。

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.
当这个禁用,用户必须在他的系统安装这个字体。

FNT字体图集是一种常用于游戏开发中的位图字体资源格式,通常由工具如BMFont生成。该格式包含一个描述字体信息的`.fnt`文件和一个或多个纹理图集(通常是PNG格式)。在某些情况下,开发者可能需要对这些图集进行拆分以满足特定需求,例如优化资源加载、减少内存占用等。 ### FNT 字体图集拆分的方法 1. **使用脚本手动解析与拆分** 可通过编写脚本解析`.fnt`文件的内容,并根据其中定义的字符位置信息将原始图集切割为单个字符图像。Python 是一种常用的选择,结合Pillow库可以实现高效的图像处理操作。以下是一个简单的 Python 示例代码: ```python from PIL import Image import xml.etree.ElementTree as ET # 加载 .fnt 文件并解析字符信息 tree = ET.parse('font.fnt') root = tree.getroot() # 打开原始图集 atlas = Image.open('font.png') # 遍历所有字符 for char in root.findall('chars/char'): id = char.get('id') x = int(char.get('x')) y = int(char.get('y')) width = int(char.get('width')) height = int(char.get('height')) # 从图集中裁剪出单个字符 char_image = atlas.crop((x, y, x + width, y + height)) # 保存字符图像 char_image.save(f'chars/{id}.png') ``` 2. **使用现成工具** - **Texture Merger** 是一款支持多种纹理集制作的工具,它不仅可以将零散纹理拼合为整图,还可以用于解析 `.fnt` 文件并导出单独字符[^3]。 - **Shoebox** 是一款开源的 Flash 开发辅助工具,其功能包括对位图字体的支持,能够帮助用户导出独立字符图像。 - **Glyph Designer** 是 macOS 上的专业位图字体编辑工具,支持导入 `.fnt` 文件并对图集进行拆解与重新配置。 ### 注意事项 - 在拆分过程中需确保字符坐标信息与图集像素尺寸的一致性,避免因精度问题导致裁剪错误。 - 若原图集使用了压缩格式,应先将其转换为未压缩格式再进行拆分操作。 - 拆分后的字符图像可进一步优化,如使用 PNG 压缩工具减小文件体积。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值