Unity | 优化专项-包体 | 字体

news2024/11/17 9:59:23

1. 字体包体占用

常用汉字字体文件大小通常在 10M~12M 左右,大概包含常见汉字 3.5w 个。我国汉字有大约将近十万个,全字库的大小对于游戏包体是灾难性的

在小游戏中,即使是常见汉字,大小也足以影响小游戏总包体,进而影响到下载及加载速度,因此在对游戏做包体优化时,字体也显得尤为重要

2. 字体子集化

所谓字体子集化,就是只提取需要用到的若干字形,生成一个非常小的字体文件,达到按需使用字形的效果

1. Fontmin

精简字体的工具有很多,这里推荐下 Fontmin,使用方法也很简单「http://ecomfe.github.io/fontmin/#terminal」

2. 提取项目中指定目录下的汉字

项目中可能用到汉字的文件主要包括配置文件(.json,.csv)、脚本(.cs)、场景(.unity)、预制体(.prefab)等,除了正式资源外,项目中也会存在测试资源,所以可以提取指定目录下的汉字

场景及预制体用文本编辑器打开后的格式:

在项目中编写插件,遍历上述文件,提取文件中的汉字,然后利用 Fontmin 生成字体文件

插件代码比较多,这里不再占用篇幅,需要的小伙伴可以在公众号回复:汉字提取

2. 常用 3500 字、7000 字

除了项目中必要的汉字外,如果允许用户自定义昵称,甚至聊天等,丢失的字符依然会影响视觉效果

作为常用汉字的基础补充,可以将常用 3500 字、7000 字也放入生成的字体文件中

3500 字的字体大小为1.1M,7000 字的字体文件大小为 2.2M,可根据需求自行评估选择

3. 构建时清除动态数据

随着编辑器的运行调试,字体资源的图集纹理也会越来越大,如果构建时不清除图集纹理,最终的包体中,图集纹理也会占用对应的空间

点击根据字体文件创建的 SDF 文件,在检视面板中勾选:Clear Dynamic Data on Build

勾选该选项后,编辑器在构建时,会清除字体资源的图集纹理,该纹理也将大小调整回大小为零

面板中其他参数,也可以根据需求自行调整

3. Fallback Font Assets

即使添加了常用 7000 字,也必然无法满足所有的汉字需求,所幸 TextMesh Pro 提供了 Fallback Font Assets 功能

官方对该功能的定义:字体图集(以及扩展的字体资源)只能包含一定数量的字形。确切的数字取决于字体、图集纹理的大小以及生成图集时使用的设置。当 TextMesh Pro 无法在文本对象的字体资源中找到字形时,后备字体系统允许您指定要搜索的其他字体资源

在 Android、iOS、微信小游戏(抖音小游戏暂不支持)平台,可以获取系统字体,动态创建备用字体资源,这样可以补充所有的字形,缺点是有可能和游戏中字体不一致,视觉效果差一些,但总要有取舍,就像这人生一样~

具体代码如下,备用字体可以换成所需的字体名字

#if UNITY_EDITOR
        return;
#endif

        void CreateFontAsset(Font font)
        {
            TMP_FontAsset fontAsset =
                TMP_FontAsset.CreateFontAsset(font, 32, 8, GlyphRenderMode.SDFAA, 1024, 1024);
            fontAsset.atlasPopulationMode = AtlasPopulationMode.Dynamic;
            fontAsset.isMultiAtlasTexturesEnabled = true;
            TMP_Settings.fallbackFontAssets.Add(fontAsset);
        }

#if WX
        WeChatWASM.WXBase.GetWXFont("", (font) =>
        {
            if (font != null)
            {
                CreateFontAsset(font);
            }
        });
#else
        string familyName = "";
#if UNITY_ANDROID
        familyName = Font.GetPathsToOSFonts()
            .FirstOrDefault(s => s.IndexOf("NotoSansCJK", StringComparison.OrdinalIgnoreCase) >= 0);
#elif UNITY_IOS
        familyName =
            Font.GetPathsToOSFonts().FirstOrDefault(s => s.IndexOf("PingFang", StringComparison.OrdinalIgnoreCase) >= 0);
#endif
        Font font = new Font(familyName);
        CreateFontAsset(font);
#endif
```

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1630222.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入探索计算机视觉:高级主题与前沿应用的全面解析

引言 计算机视觉,作为人工智能领域的一个重要分支,旨在让计算机能够“看”懂世界,理解和解释视觉场景。随着深度学习技术的迅猛发展,计算机视觉已经在许多领域取得了显著的进展,如自动驾驶、安防监控、医疗诊断等。在…

vue使用source map调试

一、开发环境 1、开启配置:devtool: ‘eval-source-map’,跟mode配置平级 效果就是控制台报错行数和源码行数完全一致 二、生产环境 1、在生产环境下,一般要关闭source map,如果只想定位报错的具体行数,且不想暴露源码。此时可…

《苍穹外卖》Day11部分知识点记录(数据统计——图像报表)

一、Apache ECharts 介绍 Apache ECharts是一款基于javascript的数据可视化图标库,提供直观、生动、可交互、可个性化定制的数据可视化图表。 官网地址:https://echarts.apache.org/zh/index.html 效果展示 柱形图饼图折线图 入门案例 1. 在 echart…

CAS机制(Compare And Swap)源码解读与三大问题

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java源码解读-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 目录 1. 前言 2. 原子性问题 3. 乐观锁与悲观锁 4. CAS操作 5. CAS算法带来的…

【算法】组合回溯专题

组合总数 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被…

MySQL-多表查询-练习

练习 1.写一个查询显示所有雇员的 last name、department id、anddepartment name。 SELECT e.LAST_NAME,e.DEPARTMENT_ID,d.DEPARTMENT_NAME FROM employees e,departments d WHERE e.DEPARTMENT_ID d.DEPARTMENT_ID;2.创建一个在部门 80 中的所有工作岗位的唯一列表&#x…

2024长三角快递物流展:科技激荡,行业焕发新活力

7月8日,杭州将迎来快递物流科技盛宴,这是一年一度的行业盛会,吸引了全球领先的快递物流企业和创新技术汇聚一堂。届时,会展中心将全方位展示快递物流及供应链、分拣系统、输送设备、智能搬运、智能仓储、自动识别、无人车、AGV机器…

nginx修改http为https

Linux运维工具-ywtool 目录 一. 获取 SSL 证书1.安装openssl2.自签名证书 二.安装SSL证书三.配置Nginx支持HTTPS四.重启nginx 一. 获取 SSL 证书 SSL/TLS证书是用来验证服务器身份和提供一个安全的连接通道的 获取SSL/TLS证书有几种方法 1.购买域名,购买SSL证书 2.自签名证书…

测试基础 学习测试你必须要知道的基础知识

1.认识测试 在学习测试之前,我们需要明白以下几点 1.什么是测试 2.测试的岗位有哪些 3.测试开发和开发之间的区别 4.优秀的测试人员需要有哪些品质 我们大概说一说 其实生活中处处有测试 我们试衣服 我们在买手机之前先看手机功能符不符合需求 这些都是测试 测试主要就是为了发…

Java | Leetcode Java题解之第46题全排列

题目&#xff1a; 题解&#xff1a; class Solution {public List<List<Integer>> permute(int[] nums) {List<List<Integer>> res new ArrayList<List<Integer>>();List<Integer> output new ArrayList<Integer>();for (i…

保护企业财务报告,这款防泄密软件做得到!

在日益增长的金融欺诈和网络攻击中&#xff0c;保护企业的财务报告是维持公司声誉和稳定运营的关键。财务报告包含了公司的敏感信息&#xff0c;如利润、收入、财务结构等&#xff0c;一旦泄露&#xff0c;可能会对公司造成不利影响。华企盾DSC数据防泄密系统为企业提供了全面的…

第58篇:创建Nios II工程之Hello_World<四>

Q&#xff1a;最后我们在DE2-115开发板上演示运行Hello_World程序。 A&#xff1a;先烧录编译Quartus硬件工程时生成的.sof文件&#xff0c;在FPGA上成功配置Nios II系统&#xff1b;然后在Nios II Eclipse窗口右键点击工程名hello_world&#xff0c;选择Run As-->Nios II …

决策树模型示例

通过5个条件判定一件事情是否会发生&#xff0c;5个条件对这件事情是否发生的影响力不同&#xff0c;计算每个条件对这件事情发生的影响力多大&#xff0c;写一个决策树模型pytorch程序,最后打印5个条件分别的影响力。 一 决策树模型是一种非参数监督学习方法&#xff0c;主要…

SpringMVC进阶(数据格式化以及数据校验)

文章目录 1.数据格式化1.基本介绍1.基本说明2.环境搭建 2.基本数据类型和字符串转换1.需求分析2.环境搭建1.data_valid.jsp首页面2.Monster.java封装请求信息3.MonsterHandler.java处理请求信息4.monster_addUI.jsp添加妖怪界面5.单元测试 3.保存妖怪信息1.MonsterHandler.java…

【面经】汇总

面经 Java基础集合都有哪些面向对象的三大特点ArrayList和LinkedList的区别&#xff1f;ArrayList底层扩容是怎么实现的&#xff1f;讲一讲HashMap、以及put方法的过程讲一讲HashMap的扩容过程Hashmap为什么要用红黑树而不用其他的树&#xff1f;Java8新特性有哪些LoadFactor负…

ASP.NET企业投资价值分析系统

摘 要 本文将影响股票投资价值的宏观因素、行业因素、企业内部等诸多因素予以量化分析&#xff0c;对钢铁板块和汽车板块各上市公司进行综合评估&#xff0c;为广大股民的投资方向和资金安全提供了有力的支持。本文还阐述了企业投资价值分析的必要性&#xff0c;说明了企业投…

【Vision Pro应用】分享一个收集Apple Vision Pro 应用的网站

您是否也觉得 Vision Pro 应用程序商店经常一遍又一遍地展示相同的几个 VisionOS 应用程序?许多有趣、好玩的应用程序似乎消失得无影无踪,让人很难发现它们。为了帮助大家更轻松地探索和体验最新、最有趣的 Vision Pro 应用程序,这里分享一个网站https://www.findvisionapp.…

通过Cmake官网下载.gz文件安装最新版本的CMAKE、适用于debian

1.前往官网下载最新版本debian https://cmake.org/download/ 2.选他 3. 通过XFTP传输到服务器 4. 解压文件 #cd 进入对应目录&#xff0c;然后执行下面命令解压 $ tar -zxvf cmake-3.29.2.tar.gz5.执行这个文件 $ ./bootstrap6.完成之后再执行这个 $ make7.然后&#xff…

Java高阶私房菜:JVM垃圾回收机制及算法原理探究

目录 垃圾回收机制 什么是垃圾回收机制 JVM的自动垃圾回收机制 垃圾回收机制的关键知识点 初步了解判断方法-引用计数法 GCRoot和可达性分析算法 什么是可达性分析算法 什么是GC Root 对象回收的关键知识点 标记对象可回收就一定会被回收吗&#xff1f; 可达性分析算…

NeRF项目代码详解

1 项目结构 开源代码&#xff1a;https://github.com/yenchenlin/nerf-pytorch 在上述框架图中&#xff0c;首先重config_parse 中读取文件参数&#xff0c; 然后通过load_blender加载数据&#xff0c;加载的数据包括训练集、验证集和测试集以及摄像机的内外参数&#xff1b; …