在游戏开发过程中,为了UI界面美观和显示效果一致性的考虑,大部分游戏都会使用动态字体来表现文字。尤其在这个看脸的时代,一种字体已经无法满足UI同学对美观的需求,因此我们常常发现若干个小则两三兆,大则十几兆的字体文件,这些文件既占包体又占内存。因此,对字体的合理使用和优化已经成为项目中后期优化必不可少的一个步骤。这里介绍《极无双》团队对于字体裁切的思路和方法。

这是侑虎科技第176篇原创文章,感谢作者王亮供稿。欢迎转发分享,未经作者授权请勿转载。作者QQ:10096986。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。(QQ群465082844)

同时,作者也是U Sparkle活动参与者哦,UWA欢迎更多开发朋友加入 U Sparkle开发者计划,这个舞台有你更精彩!


◆◆
问题描述

我们《极无双》项目中使用了两套字库。黑体字体来显示大部分既定文本、玩家昵称、对话等。隶书字体来特殊显示一些标题、武将姓名、称号、重要对话等需要着重美化显示的文字。

开始优化前,我们习惯性地在UWA平台上(www.uwa4d.com)提测了一下,在得到的报告中查看:内存管理>> 具体资源信息 >> 字体资源 这一页。如下图所示,那时候从内存曲线图上看到字体资源占用内存高达12MB。

在此先赞一下UWA测评报告,其在定位问题资源时真是高效。报告很明确地指向了两个可以优化的方向:1)内存占用;2)数量峰值。对于数量峰值为2表示每个字体各自有一份冗余资源。

究其原因如下:
1)游戏早期登陆阶段的场景,以及里面用到的贴图、字体等资源往往是不能用AssetBundle进行加载的。而这些贴图和字体等资源如果又在AssetBundle里面有依赖,就会在项目中存在相同的两份;

2)内存占用很好理解,基本上字库的磁盘容量等同于内存占用。


◆◆
优化方案

1. 字库裁切
既然我们接下来要做字体精简的工作,那么针对登陆阶段/游戏阶段的不同应用场景,可以设计不同的裁切字库。最终我们的设计如下图所示:

2. 实际操作
裁切字体的工具很多,我们选用的工具是FontSubsetGUI,简单够用。大家只要准备好一个包含你需要字符的txt文件和TTF原文件。运行FontSubsetGUI,选好TTF文件和TXT文件的路径,【Proceed】生成新TTF文件。


◆◆◆
效果 & 小结

精简之后在UWA上复测,最终字体占用内存从12MB降低到4.9MB,效果拔群。

通过上述的优化操作,笔者得出结论如下:

    1. 针对不同字体的应用场景,设计有效精简的裁切字库。
    2. 需要注意同一个字体资源在AssetBundle内外可能都会有依赖,如果依赖不能避免,那么就要各自设计裁切字库。

如何精简Unity中使用的字体文件的更多相关文章

  1. Unity中一键创建常用文件夹

    Unity中一键创建常用文件夹 说明 项目测试版本Unity5.3. 这个一个小工具:功能非常简单,就是一键给新建工程添加所有文件夹.到此结束. 但是具体咋操作呢? 与把大象装进冰箱一样,三步,下载代 ...

  2. 关于Unity中的NGUI字体

    NGUI字体类型 1: UIFont字体,UIFont类实现的2: TTF动态字体的使用3: BBCode的特殊字体的使用4: NGUI字体制作5: BMFont字体制作和艺术字体的制作6: UILa ...

  3. Unity中所有特殊的文件夹

    1. 隐藏文件夹以.开头的文件夹会被Unity忽略.在这种文件夹中的资源不会被导入,脚本不会被编译.也不会出现在Project视图中.2. Standard Assets在这个文件夹中的脚本最先被编译 ...

  4. Unity中提升像素字体清晰度

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Unity5.6.0f3 Unity UI系统是非常好的,但默认情况下,使用像像素艺术风格游戏那样需要非常锋利的边框的字体 ...

  5. Unity 使用BMFont制作字体

    参考链接:http://blog.csdn.net/huang9012/article/details/32333913,作者:CSDN huang9012 NGUI版本:3.6.5 要自己制作字体, ...

  6. Unity编程标准导引-Unity中的基本概念-2.1界面概览

    Unity中的基本概念 本文我们介绍Unity中的基本概念,包括:场景.游戏对象.组件.预制件.资源等. 2.1.界面概览 打开Unity之后,我们大概可以看到以上画面,以上画面中即显示了我们最常用到 ...

  7. Unity中加入Android项目的Build步骤

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 简介: 有的项目需要在Android中加入Unity功能,例如ANDROID应用中嵌入Un ...

  8. 骨骼动画的原理及在Unity中的使用

    制作骨骼动画 我们看看这几步操作后,我们得到了那些数据: 1.每个皮肤顶点的初始世界坐标. 2.每个骨骼关节顶点的初始世界坐标. 3.每个顶点被骨骼顶点的影响信息. 4.骨骼如何移动. 骨骼动画原理 ...

  9. cocos2d-x 中 TTF 字体文件的位置

    cocos2d-x 中,字体文件需要保存在 fonts 文件夹中,如果字体路径中没有 fonts/ 会自动添加上这个文件夹. 如果字体名称没有 .ttf 后缀,也会自动加上这个后缀. unsigned ...

随机推荐

  1. 国际混淆C代码大赛获奖作品部分源码

    国际C语言混乱代码大赛(IOCCC, The International Obfuscated C Code Contest)是一项国际编程赛事,从1984年开始,每年举办一次(1997年.1999年 ...

  2. Kotlin尝试

    Kotlin 是一种静态类型的编程语言,可在 Java 虚拟机上运行,也可以编译为 JavaScript 源代码.其主要发展来自位于俄罗斯圣彼得堡的 JetBrains 程序员团队.虽然语法与 Jav ...

  3. day1作业登录接口总结

    作业一:编写登陆接口 1.输入用户名和密码 2.认证成功后显示欢迎信息 3.输错三次后锁定 上面作业,用了几种思路来解决问题:但是本质上其实都是一样的:核心都是对文件的操作,文件的增删改查:并且这些操 ...

  4. s3c2440地址分配

    mini2440的地址怎么分配.mini2440处理器的地址怎么分配. S3C2440处理器可以使用的物理地址空间可以达到4GB,其中前1GB的地址为连接外设的地址空间.>1G的地址空间 分配给 ...

  5. luoguP3952 [NOIP2017]时间复杂度 模拟

    原本只是想看下多久能码完时间复杂度 然后在30min内就码完了,然后一A了???? 首先,这题完全可以离线做 我们先把所有的操作读完,判断合不合法之后,再去判断和标准答案的关系 具体而言 把所有的操作 ...

  6. 502 解决:[WARNING] fpm_children_bury

    查过网上的资源,基本都是认为是php线程打开文件句柄受限导致的错误.具体的解决的办法如下:   1.提升服务器的文件句柄打开打开 /etc/security/limits.conf : (增加) * ...

  7. 20162327WJH2016-2017-2《程序设计与数据结构》课程总结

    20162327WJH2016-2017-2<程序设计与数据结构>课程总结 一.每周作业链接汇总 第一周作业:算法分析 第三周作业:查找与排序 第五周作业:有关栈的总结 第七周作业:树的有 ...

  8. VMWare虚拟机下CentOS 配置网络实现远程连接,提供Web访问

        最近使用VMWARE虚拟机当中redhat操作系统,感觉直接使用很不方便,于是就决定配置下redhat网络,通过本机远程工具SecureCRT来连接redhat使用.     环境说明:本机操 ...

  9. zoj 3537 区间dp+计算几何

    题意:给定n个点的坐标,先问这些点是否能组成一个凸包,如果是凸包,问用不相交的线来切这个凸包使得凸包只由三角形组成,根据costi, j = |xi + xj| * |yi + yj| % p算切线的 ...

  10. 【POJ】1840:Eqs【哈希表】

    Eqs Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 18299   Accepted: 8933 Description ...