iOS上Font引起的莫名CPU Spike

来源:互联网 发布:小学生编程需求 编辑:程序博客网 时间:2024/06/03 20:59

我们做了个很简单的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了。

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


0 0