文章目录

  • 前言
  • 一、字体打包优化
  • 二、ab打包冗余
    • 1、问题
    • 1、解决方法
  • 三、字体静态优化
  • 四、扩展
  • 总结


前言

优化TextMeshPro包体大小的方法记录。


一、字体打包优化

游戏开发阶段通常使用Fast打包方式,在正式项目发布的时候需要切换一下打包方式,重新将字体打包,会获得更好的性能。(注:打包时间长达30分钟以上,想要精度更高选择SDF8等渲染模式将会更慢)
​​​​在这里插入图片描述

二、ab打包冗余

1、问题

打ab包时,预制体使用TMP会把字体打进预制中形成冗余,体积增大的同时打包速度更是如蜗牛般缓慢。解决方法,参考网上解决方案:

http://t.csdnimg.cn/3yLlC

1、解决方法

​方法为直接修改源码加载方式,下面简述其过程:

将TMP插件下的 Resources 文件夹改名为TMPPro,将字体、txt文本移动至Fonts文件夹
将TMP的包com.unity.textmeshpro从Library下移动至Packages并将文件和子文件取消只读勾选(项目不需要上传git平台忽略此步)
找到Packages\com.unity.textmeshpro\Scripts\Runtime\TMP_Setting.cs和Packages\com.unity.textmeshpro\Scripts\Editor\TMP_SettingsEditor.cs

在这里插入图片描述

1、修改TMP_Setting.cs

        public static TMP_Settings instance{get{if (s_Instance == null){//s_Instance = Resources.Load<TMP_Settings>("TMP Settings");#if UNITY_EDITORs_Instance =UnityEditor.AssetDatabase.LoadAssetAtPath<TMP_Settings>("Assets/TextMesh Pro/TMPPro/TMP Settings.asset");// Make sure TextMesh Pro UPM packages resources have been added to the user projectif (s_Instance == null && Time.frameCount != 0){// Open TMP Resources ImporterTMP_PackageResourceImporterWindow.ShowPackageImporterWindow();}
#endif}return s_Instance;}set { TMP_Settings.s_Instance = value; }}

2、修改TMP_SettingsEditor

  static UnityEngine.Object GetTMPSettings(){//return Resources.Load<TMP_Settings>("TMP Settings");return UnityEditor.AssetDatabase.LoadAssetAtPath<TMP_Settings>("Assets/TextMesh Pro/TMPPro/TMP Settings.asset");}

3、打包测试一下,看来TMP_Settings只在Editor模式下加载,必须在运行时也添加相应的加载代码,否则会出现以下情况
在这里插入图片描述
4、加载AB包后赋值。如何加载?我只能说懂得都懂,额,其实是因为大家使用的ab加载方式不同,所以加载方式会略有不同。为了防止刚接触的萌新不懂,我这里用伪代码列举一下:

using UnityEngine;
using System.Reflection;public class Main : MonoBehaviour
{//拖拽或者通过加载ab等方式获取public TMPro.TMP_Settings TMP_Settings;    private void Awake(){//初始化游戏热更框架Asset.Instance.InitFrameWork();}void Start(){//热更资源-完成后回调StartGame方法HotUpdateManager.Instance.HotAndUnPackAssets(xxx, StartGame);}/// <summary>/// 开始游戏,加载登录界面/// </summary>public void StartGame(){LoadTMP_Setting();UIModule.Instance.Initialize();UIModule.Instance.OpenWindow<LoginWindow>();}private void LoadTMP_Setting() {var settingsType = TMP_Settings.GetType();var settingsInstanceInfo = settingsType.GetField("s_Instance", BindingFlags.Static | BindingFlags.NonPublic);settingsInstanceInfo.SetValue(null, TMP_Settings);}}

5、如果有ab框架,那么则需要在框架中提前加入这个固定的字体依赖或者排除冗余,然后再特定时机加载
在这里插入图片描述
在这里插入图片描述
7、完美解决

在这里插入图片描述

三、字体静态优化

接下来我们打包ab时会非常迅速,但会出现包体过大的问题,本来几十k、几百k的文件打ab包后会增加数十倍。

原因之一是打包时使用了动态字体,那我们在打包时将字体设为静态,打包完成后再恢复就能大幅度降低包体大小。(可使用代码写一个打包方法)
在这里插入图片描述

TMP_Settings.GetFontAsset().atlasPopulationMode = AtlasPopulationMode.Static;
BuidEditor.BuildAll();//伪代码
TMP_Settings.GetFontAsset().atlasPopulationMode = AtlasPopulationMode.Dynamic;

如果你发现构建后的项目包体大小仍然有些偏大,可以通过剔除未使用的字体并制作专属的字体集来进一步优化包体。这样可以显著减少包体大小,使其更加精致和完美。

四、扩展

图文嵌套排版
表情包支持
多语言支持(两种方式:官方多语言,扩展TextMeshPro)
待更新


总结

暂无

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 之 【简介 set、multiset、map、multimap 的使用】

目录 1.序列式、关联式容器 2.键值对 3.set 3.1set的简介 3.2set的常用函数 4.multiset 5.map 5.1map的简介 5.2map的常用函数 6.multimap 7.练习题 1.序列式、关联式容器 vector、deque、list、forward_list、array等是CSTL中的序列式容器 其核心特性是 元素按插入…

数据结构——排序(升级篇:快速排序、堆排序、希尔排序、计数排序)

1. 快速排序&#xff08;Quick Sort&#xff09; 原理&#xff1a; 选择一个基准值&#xff08;pivot&#xff09;将数组分成两部分&#xff1a;小于 pivot 的放左边&#xff0c;大于 pivot 的放右边。然后递归处理 工作过程示例&#xff1a; 示例数组&#xff1a;[5, 3, 8, 4,…

C++:浅尝gdb

hp window11 wsl ubuntu what is gdb&#xff1f; GNU调试器&#xff08;英语&#xff1a;GNU Debugger&#xff0c;缩写&#xff1a;GDB&#xff09;&#xff0c;是GNU软件系统中的标准调试器&#xff0c;此外GDB也是个具有移携性的调试器&#xff0c;经过移携需求的调修与…

Android输入法一些常用的命令

Android开发过程可能会遇到Android输入法异常的问题&#xff0c;可以通过如下命令来查看和修改系统的输入法。方便调试。 获取当下系统的所有输入法 adb shell ime list获取当前的可用输入法 adb shell ime list -s获取当前的输入法 adb shell settings get secure default_inp…

Sklearn 机器学习 手写数字识别 加载并查看数据

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Sklearn 机器学习 手写数字识别:加载并查看数据 在机器学习入门案例中,手写数字识别…

卫星通信链路预算之七:上行载噪比计算

在前面的文章中我们介绍了卫星通信链路计算的基础知识&#xff0c;包括&#xff1a; 信噪比分配&#xff1b; 带宽和功带平衡原则&#xff1b; EIRP和G/T&#xff1b; 输入回退&#xff1b; 输入饱和通量密度SFD&#xff1b; 输出回退&#xff1b; 这次我们正式进入正题…

一文读懂PDB格式

最近在做分子对接和分子模拟&#xff0c;涉及到了一些盲区&#xff0c;必去pdb文件是按照列位数储存信息的&#xff0c;跟其他文件的空格或者制表符分割很不同&#xff0c;所以也可能出现一些错误&#xff0c;比如信息错位&#xff0c;因此有必要了深入解下结构相关的格式pdb、…

进阶:PGCE中级专家认证精要

PGCE中级认证的核心价值技术深度&#xff1a;掌控未来生态PostgreSQL不仅是传统关系型数据库的标杆&#xff0c;更是云原生、AI大模型训练、物联网平台等前沿场景的核心支撑。通过PGCE认证&#xff0c;你将掌握&#xff1a;万亿级数据性能调优&#xff1a;从查询优化器原理到执…

AI增强SEO关键词表现

内容概要 随着人工智能技术的不断演进&#xff0c;其在搜索引擎优化领域展现出显著潜力&#xff0c;尤其在关键词表现优化方面发挥着核心作用。本文将从基础概念入手&#xff0c;系统探讨AI如何智能提升关键词的搜索可见性、流量吸引力和转化效率&#xff0c;从而驱动整体SEO策…

PG靶机 - PayDay

一、 初步侦察与服务探测 1.1 端口扫描与服务识别 首先&#xff0c;对目标主机 192.168.163.39 进行一次全面的端口扫描&#xff0c;以识别其上运行的各项服务。 sudo nmap 192.168.163.39 -p- --min-rate5000 -A图 1: Nmap 扫描结果&#xff0c;显示开放 80、445 和 995 等端口…

MySQLl中OFFSET 的使用方法

MySQLl中OFFSET 的使用方法基本语法SELECT column1, column2, ... FROM table_name LIMIT number_of_rows OFFSET offset_value;number_of_rows&#xff1a;指定返回的记录数量。offset_value&#xff1a;从第几条记录开始返回&#xff08;偏移量从 0 开始计数&#xff09;。示…

监管科技(RegTech)应用:技术驱动的合规革命

目录 监管科技(RegTech)应用:技术驱动的合规革命 1. 监管科技革命:数字化合规新范式 2. 技术架构全景 2.1 现代RegTech架构 2.2 合规效率公式 3. 核心技术实现 3.1 智能合约自动化合规 3.2 AI驱动的风险监测引擎 4. 核心应用场景 4.1 KYC/AML全流程自动化 4.2 实时交易监控系…

解决SQL Server连接失败:Connection refused: connect

今天创建数据库&#xff0c;本地连接SQL Server报错&#xff1a;“通过端口 1433 连接到主机 127.0.0.1 的 TCP/IP 连接失败。错误&#xff1a;Connection refused: connect”报错图如下&#xff1a;查了一圈&#xff0c;问题出在&#xff1a;TCP/IP 没启用。如果问题和我一样&…

Windows bypassUAC 提权技法详解(一)

引言 用户账户控制&#xff08;User Account Control, 简称 UAC&#xff09;是微软自 Windows Vista 起引入的一项安全功能&#xff0c;旨在通过要求用户在执行需要管理员权限的操作时进行确认&#xff0c;从而防止未经授权的系统更改。UAC 的设计初衷是提高系统安全性&#xf…

OpenCV ------图像基础处理(一)

在 OpenCV 的图像处理世界中&#xff0c;除了图像边框处理&#xff0c;还有一些基础且重要的函数和运算&#xff0c;它们在图像编辑、融合等场景中发挥着关键作用。下面我们就来详细介绍cv2.copyMakeBorder()函数的具体参数与作用&#xff0c;以及图像加法运算和加权运算的相关…

Unity宝箱随机事件实现指南

目录 前言 一、简单的使用 新增ChestInteractableEvents&#xff0c;定义宝箱交互事件 新增Box 箱子挂载脚本&#xff0c;配置事件 运行效果 二、完善各种事件 1. 完善生成金币事件 效果&#xff0c;金币飞出 2. 完善生成敌人事件敌人 效果 3. 完善生成药水事件 效…

从单机到分布式:用飞算JavaAI构建可扩展的TCP多人聊天系统

1. 引言&#xff1a;飞算JavaAI与实时通信技术的融合 1.1 为什么需要TCP多人聊天室&#xff1f; 在即时通讯领域&#xff0c;基于TCP协议的聊天室是理解网络编程核心概念的经典案例&#xff0c;其技术价值体现在&#xff1a; 底层协议控制&#xff1a;直接操作Socket实现可靠数…

用 mock 把 ES 单元测试@elastic/elasticsearch-mock 上手

一、为什么“单元测 ES”这么别扭&#xff1f; 测试 ES 代码时&#xff0c;最直觉的做法是连真集群做集成测试&#xff08;Docker 起个 ES&#xff09;&#xff0c;但&#xff1a; 启动 & 数据装填慢&#xff0c;不利于并行&#xff1b;网络/磁盘抖动影响稳定性&#xff1b…

《嵌入式Linux应用编程(三):Linux文件IO系统调用深度解析》

今日学习内容1. 文件IO与标准IO核心对比特性标准IO文件IO实现层C标准库Linux内核系统调用缓冲机制全缓冲/行缓冲无缓冲&#xff08;实时读写&#xff09;操作对象FILE*流指针整型文件描述符&#xff08;fd&#xff09;移植性跨平台兼容Linux特有典型应用场景普通文件操作硬件设…

数据结构之顺序表相关算法题

目录一、移除元素二、删除有序数组中的重复项三、合并两个有序数组总结一、移除元素 移除元素 - 力扣 思路一&#xff1a;就是创建一个临时数组&#xff0c;对原数组进行遍历&#xff0c;找出与val不同的数据放到新数组里&#xff0c;然后再将tmp中的数据导回原数组 这个思…