unity优化webgl下的textMeshPro字体大小

成果:优化前2.5M的字体文件优化后只有几百kb不到1m了

背景:unity微信小游戏要求字体文件在3m以内姑且我认为2.5m以内实际可以干到1M以内。微信小游戏要求尽可能的进游戏快,在这个背景下我们需要对字体进行优化,我采用的是3500字的常见中文,一些符号它没有包含进去所以用了一个FallbackLIst字体库(很小)另外参考博客优化TMP字体资源大小的思路_tmp优化-CSDN博客  另外我多提一下首包界面的字体也需要单独处理buildin的字体没法显示中文只能显示数字这是一个坑(webgl平台),所以也需要进行字体裁剪,可以百度fontzip64链接在这里FontZip/FontZip at master · forJrking/FontZip · GitHub

进去后下载FontZip64.exe

运行后长这样如下图所示:首先选中你的字体然后输入提取字,提取字你可以写一个工具去提取工程中的所有中文文本,或者自定义。 

进去后下载

第一步,将FontAsset的模式改为静态

上图中字体是静态还是动态也可以通过代码设置接口如下:

TMP_Settings.GetFontAsset().atlasPopulationMode = AtlasPopulationMode.Static;
TMP_Settings.GetFontAsset().atlasPopulationMode = AtlasPopulationMode.Dynamic;


第二部选中编辑器中的otf字体如下图所示,选中这张贴图资源复制一份出来。复制出来后长这样:

第三步:选中字体如下图所示

第四步:注意这里的EnglishAltas纯纹理格式Texture2D转为png格式

这里我们可以先把原来字体内置的纹理给删除直接上代码就是

先选中字体然后执行下面的这个菜单项

 [MenuItem("Tools/优化字体/第一步")]
 static void OplizeFont()
 {
     if (Selection.activeObject is TMP_FontAsset TMPFontAsset)
     {
         AssetDatabase.RemoveObjectFromAsset(TMPFontAsset.atlasTexture);
         AssetDatabase.SaveAssets();
     }
     else
     {
         Debug.Log("请选中字体文件");
     }
 }

然后选中新的字体纹理执行菜单 这里按之前优化TMP字体资源大小的思路_tmp优化-CSDN博客 

他这里提到的方法我试了一下有报错,我这里改了一下。我们提取出来的纹理文件没有开启可读属性所以这里需要读取他的纹理像素,需要用到RT的技术 

[MenuItem("Tools/优化字体/第二步")]
static void OplizeFont2()
{
    if (Selection.activeObject is Texture2D readOnlyTexture)//选中上面提到的新字体纹理
    {
        Texture2D newTex = new Texture2D(readOnlyTexture.width, readOnlyTexture.height, readOnlyTexture.format, false);

        // 读取原始纹理的像素数据
        RenderTexture currentRT = RenderTexture.active;
        RenderTexture tempRT = RenderTexture.GetTemporary(readOnlyTexture.width, readOnlyTexture.height, 0, RenderTextureFormat.ARGB32);
        Graphics.Blit(readOnlyTexture, tempRT); // readOnlyTexture选中的纹理渲染到tempRT上 
        RenderTexture.active = tempRT;//设置为激活 RT 然后就可以读取像素 ReadPixels 
        newTex.ReadPixels(new Rect(0, 0, readOnlyTexture.width, readOnlyTexture.height), 0, 0);
        newTex.Apply();

        // 现在 newTex 包含了纹理的数据
        byte[] pngData = newTex.EncodeToPNG();

        // 指定保存文件的路径


        byte[] bytes = pngData;
        System.IO.File.WriteAllBytes("Assets/Res_Dev/Fonts/English SDF.png", bytes);
        AssetDatabase.Refresh();
        var TextPng = AssetDatabase.LoadAssetAtPath<Texture2D>("Assets/Res_Dev/Fonts/English SDF.png");
        //批量赋值,或者只用上面的代码创建png,手动赋值
        //加载字体
        TMP_FontAsset targeFontAsset = AssetDatabase.LoadAssetAtPath<TMP_FontAsset>("Assets/Res_Dev/Fonts/English SDF.asset");
        var matPresets = TMP_EditorUtility.FindMaterialReferences(targeFontAsset);
      
        foreach (var material in matPresets)
        {
            material.SetTexture("_MainTex", TextPng);//设置字体材质贴图
        }
        AssetDatabase.Refresh(); // 更新到unity本地数据库library

// 重新设置 RenderTexture
        RenderTexture.active = currentRT;// 还原成原currentRT
        RenderTexture.ReleaseTemporary(tempRT);// 释放new的RT资源 


        
        

    }
    

}

第五步:

设置该纹理的压缩格式一般webgl就是ASTC8X8这是微信推荐的,对于字体我会采用100的压缩质量,其他ui酌情设置为50.

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

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

相关文章

Spark的学习-02

Spark Standalone集群的安装 架构&#xff1a;普通分布式主从架构 主&#xff1a;Master&#xff1a;管理节点&#xff1a;管理从节点、接客、资源管理和任务 调度&#xff0c;等同于YARN中的ResourceManager 从&#xff1a;Worker&#xff1a;计算节点&#xff1a;负责利用自己…

Vue前端框架

一.Vue概述 *Vue 是一套前端框架&#xff0c;用于免除原生JavaScript中的DOM 操作&#xff0c;简化书写。 *基于MVVM(Model-View-ViewModel)思想&#xff0c;实现数据的双 向绑定&#xff0c;将编程的关注点放在数据上。 *官网&#xff1a; https://cn.vuejs.org/ 二.Vue快速…

软件设计师 7日速成

数据流图和数据字典 数据流图 定义 数据流图是一种图形化的工具&#xff0c;用于描述系统中数据的流动情况。它可以帮助我们可视化数据在系统中的处理过程&#xff0c;包括数据的来源、去向、存储位置以及处理方式。 组成元素 数据流图通常包含以下四个基本元素&#xff1…

基于 Vue3、Vite 和 TypeScript 实现开发环境下解决跨域问题,实现前后端数据传递

引言 本文介绍如何在开发环境下解决 Vite 前端&#xff08;端口 3000&#xff09;和后端&#xff08;端口 80&#xff09;之间的跨域问题&#xff1a; 在开发环境中&#xff0c;前端使用的 Vite 端口与后端端口不一致&#xff0c;会产生跨域错误提示&#xff1a; Access to X…

【Allure】allure装饰器函数

**allure装饰器**​作用&#xff1a;用于将测试用例的数据展示到测试报告中 1.需要将这些装饰器函数添加**测试方法或测试类的开头**。2.同一个类或者一个方法可以添加多个装饰器函数 &#xff0c;这样此用例就具有了个作用属性 。 allure.epic() 敏捷中的概念 项目名称 allu…

python验证码滑块图像识别

文章目录 1、案例图片1、需求说明2、代码实现总结 1、案例图片 1、需求说明 python 3.10,写一个滑块验证码的自动化程序。需要一个opencv的函数&#xff0c;能准确的计算&#xff0c;在这同一张图片上&#xff0c;滑块形状和缺口形状的坐标位置及两个形状之间在X轴上的距离。请…

Linux基础-常用操作命令详讲

Linux基础-常用操作命令详讲 一、openssl加密简单介绍 1. 生成加密的密码散列&#xff08;password hash&#xff09;​编辑 1.1 常见的选项总结表 1.2 加密参数详解 2. 自签名证书 3. 证书转换 二、文件管理 1. 创建空文件 ​编辑 2. 删除文件 4. 新建目录 ​编辑…

【RAG系列】KG-RAG 用最简单的方式将知识图谱引入RAG

目录 前言 一、引入知识图谱的作用 二、引入知识图谱的挑战 三、KG-RAG的理论 query多跳有限性 知识局部密集性 四、KG-RAG的方法 向量入库 向量相似搜索 扩展子图 LLM Rerank LLM response 五、效果比对 六、源码 总结 前言 本文介绍一种比较新颖的RAG范式&am…

编程语言越来越多,为什么C/C++还没有被现在的时代淘汰呢?

近年来&#xff0c;随着人工智能、大数据等领域的兴起&#xff0c;各种新兴编程语言层出不穷&#xff0c;例如Python、Go等&#xff0c;它们以更简洁的语法、更丰富的库以及更友好的开发体验&#xff0c;吸引了大量开发者。 在这样的背景下&#xff0c;不少人开始质疑C/C这类“…

Docling:开源的文档解析工具,支持多种格式的解析和转换,可与其他 AI 工具集成

❤️ 如果你也关注大模型与 AI 的发展现状&#xff0c;且对大模型应用开发非常感兴趣&#xff0c;我会快速跟你分享最新的感兴趣的 AI 应用和热点信息&#xff0c;也会不定期分享自己的想法和开源实例&#xff0c;欢迎关注我哦&#xff01; &#x1f966; 微信公众号&#xff…

学习笔记:Spring框架源码Part.2——核心

学习视频链接&#xff1a;https://www.bilibili.com/video/BV1zd4y1L7YD Spring学习笔记——核心 前言第三章 容器和上下文一、认识bean工厂1、基础能力2、更强的枚举能力3、灵活的分层能力4、构建和自动装配的能力5、更强的配置能力6、更多配置项7、工厂的生命周期 二、bean工…

linux守护进程与后台进程的区别

守护进程与后台进程有以下区别&#xff1a; 1. 概念与定义 后台进程&#xff1a; 是指在操作系统后台运行的进程&#xff0c;它不与用户直接交互&#xff08;没有连接到用户的终端&#xff09;。用户在终端中启动一个程序并让其在后台运行&#xff08;如通过在命令后加“&…

【360】基于springboot的志愿服务管理系统

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装志愿服务管理系统软件来发挥其高效地信息处理的作用&#x…

【LLM Agents体验】Dify框架的安装指南

Dify简介&#xff1a; 核心功能‌12 ‌Dify是一款开源的大语言模型(LLM)应用开发平台&#xff0c;融合了后端即服务&#xff08;Backend as a Service, BaaS&#xff09;和LLMOps的理念&#xff0c;使开发者可以快速搭建生产级的生成式AI应用。LLMOps涵盖了大型语言模型的开发、…

TODO Error occurred while trying to proxy:【】

文章目录 场景异常解决 场景 使用 Ant Disign Pro 连接本地接口。 异常 Error occurred while trying to proxy: localhost:8000/api/login/account?token%20%20123[HPM] Error occurred while proxying request localhost:8000/api/login/account?token%20%20123 to http…

Linux 文件基本属性

1.Linux 文件基本属性 Linux 系统是一种典型的多用户系统&#xff0c;不同用户处于不同地位&#xff0c;拥有不同的权限。为了保护系统的安全性&#xff0c;Linux 系统对不同的用户访问同一文件&#xff08;包括目录文件&#xff09;的权限做了不同的规定。Linux 通常使用以下两…

数据结构-归并排序笔记

【数据结构】八大排序(超详解附动图源码)_数据结构排序-CSDN博客 看这个学思路 一 归并排序介绍: 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法&#xff0c;该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解&#xf…

关于使用python pptx生成或“复制”PPT页面的问题

先说两个结论&#xff1a; 对于主题不完全相同的页面&#xff0c;pptx 无法完全复制PPT页面&#xff0c;文字图片可以复制&#xff0c;但是背景之类的无法复制pptx 无法直接在指定页码或者指定页面后插入页面 今天做项目的时候&#xff0c;需要根据PPT模板使用python生成相应…

Uniapp底部导航栏设置(附带PS填充图标教程)

首先需要注册和登录ifconfont官网&#xff0c;然后创建项目添加需要的图标 创建和添加图标库请参考&#xff1a;Uniapp在Vue环境中引入iconfont图标库&#xff08;详细教程&#xff09; 打开iconfont官网&#xff0c;找到之前添加的图标库&#xff0c;下载png图片 如果需要的…

算法——双指针

目录 前言一、什么是双指针二、算法特点三、算法实现步骤四、常见形式五、应用场景与示例六、优势与注意事项七、双指针算法动态图解八、经典例题[1. 回文判定](https://www.lanqiao.cn/problems/1371/learning/?page1&first_category_id1&name%E5%9B%9E%E6%96%87%E5%…