文章目錄
- 前言
- 一、字體打包優化
- 二、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)
待更新
總結
暫無