iOS上Font引起的莫名CPU Spike

通过使用Profiler工具定位到Font.CacheFontForText导致的CPU峰值问题,发现是由于动态字体文件在加载中文文本时重建纹理所引起。解决方法是将Start按钮的文本也进行本地化,避免再次触发该过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们做了个很简单的demo,在mainmenu上点击一个Start按钮后,隐藏这个菜单并加载HUD,此时会发现Start被点击后过了2秒左右才弹起来,然后HUD才出现。

这个让我摸不着头脑的bug存在了两天,走了如下几条弯路:

  1. Singleton的localization在第一次调用Instance时载入localization.xml,怀疑这个载入消耗的时间过长;
  2. 在可能的地方加Debug.log()打印各个调用消耗的时间,虽然都很短,但注释掉某条语句后暂停现象立刻消失,因此怀疑有coroutine存在,但一直没找到;
  3. 因为迟迟找不出协程,又回过头去怀疑localization manager中的Dictionay<string, string>用string作为key查找效率会很低。
可是,事实也就和第二条有点关系。而发现最终原因的方法是使用了合适的工具:profiler。选择做profile的原因是我想看看这超长的一帧里到底都做了些啥。

最后,发现了这个罪魁祸首:Font.CacheFontForText。Unity Forum有人回复“CPU spike will happen when attempting to render glyphs that aren't currently in the font map for the dynamic font file.” 在我们的bug出现步骤里,原先UI上的text是英文,所以只有英文的font,当点击start以后加载HUD,而HUD上有中文的localized text,所以Unity会rebuild font texture来把所有的中文字符加载的这个贴图中去,当然这是在font导入时选择dynamic的机制。据说如果用static font style就不会有这个bug出现,但static的话就会在内存中占用几兆内存。

所以,我最终的解决方法是把Start按钮的text也用localization替换,因此点击start后就不再会出现cpu spike了。

经验:
不能一下洞察问题的原因时就赶紧想想该找什么工具帮忙吧!“君子性非异也,善假于物也”


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值