关于 UGUI 字体花屏或乱码。

2024-06-19 19:38
文章标签 乱码 字体 ugui 花屏

本文主要是介绍关于 UGUI 字体花屏或乱码。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自:www.cnblogs.com/yaukey/p/unity_ugui_font_texture_uv_wrong.html

我们项目从某个时候开始ui突然开始出现字体花屏现象(unity 开发版本:5.3.6p6),而且很难必现却又时有发生,确实查找和解决起来并不太容易。

  关于这个问题,uwa官方给出了解释,http://blog.uwa4d.com/archives/techsharing_35.html, http://blog.uwa4d.com/search/%E5%AD%97%E4%BD%93/。可用的方案就是一开始把字体扩容到足够大,但对于常用汉字就有3000多个,再加上不同的大小和样式,不同的字体,内存占用光想一想就很可观,所以将此当做最保底的方案。Unity 官方应该是解决过这个问题,但是没有彻底。但是我更加高度怀疑的是:FontTexture 本身的生成和对应的 UV 信息并没有问题,而是字体使用的 UV 有问题(没有更新),uwa 提供的方案可能是针对的早期问题,也许现在问题是新引起的。

  后来又看到雨松MOMO的博客也有提到并给出了解决方案:http://www.xuanyusong.com/archives/4259,这个方法很好,在 FontTexture 重建时在其后的 LateUpdate 中刷新所有的 Text,这个方案也是我希望的方式,不会产生过多的浪费字体纹理。不过 GameObject.FindObjectsOfType<Text>() 这个调用我觉得对于 Text 过多的场景恐怕效率堪忧,翻阅了下 UI 的源码,发现其中有个类 UnityEngine.UI.FontUpdateTracker 就是专门用来更新 Text 相关字体信息的,但是接口都不是 public,但是可以反射调用就好,所以可以用此对 雨松MONO 的方案优化一下:

复制代码
using UnityEngine;
using System.Collections;
using System.Collections.Generic;public class DynamicFontTextureRebuildTracker : MonoBehaviour
{private class FontUpdateNode{private bool m_FontTextureRebuilt = false;private Font m_FontRebuilt = null;public FontUpdateNode(Font font){m_FontRebuilt = font;Validate();}public void Validate(){if (null == m_FontRebuilt){m_FontTextureRebuilt = false;Debug.LogWarning("You need a actual font to validate!");return;}m_FontTextureRebuilt = true;}public void Invalidate(){m_FontTextureRebuilt = false;}public bool NeedUpdate{get { return m_FontTextureRebuilt && (null != m_FontRebuilt); }}public Font font{get { return m_FontRebuilt; }}}private System.Reflection.MethodInfo m_RebuildForFont = null;private List<FontUpdateNode> m_FontUpdateList = new List<FontUpdateNode>();private static DynamicFontTextureRebuildTracker m_Instance = null;void Awake(){if (null != m_Instance){Debug.LogError("There is only one DynamicFontTextureRebuildTracker instance allowed!");Destroy(gameObject);return;}m_Instance = this;}// Use this for initializationvoid Start() {Font.textureRebuilt += OnFontTextureRebuilt;System.Type fontUpdateTrackerType = typeof(UnityEngine.UI.FontUpdateTracker);m_RebuildForFont = fontUpdateTrackerType.GetMethod("RebuildForFont", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);Debug.Log("Get RebuildForFont method is: " + m_RebuildForFont);}// Update is called once per framevoid LateUpdate() {if (null == m_RebuildForFont){return;}for (int i = 0; i < m_FontUpdateList.Count; i++){FontUpdateNode node = m_FontUpdateList[i];if (node.NeedUpdate){Font font = node.font;m_RebuildForFont.Invoke(null, new object[] { font });// Log rebuild.Texture fontTexture = font.material.mainTexture;Debug.Log(string.Format("Texture of dynamic font \"{0}\" is enlarged to {1}x{2}.", font.name, fontTexture.width, fontTexture.height));node.Invalidate();}}}void OnDestroy(){Font.textureRebuilt -= OnFontTextureRebuilt;}private void OnFontTextureRebuilt(Font font){bool findThisFont = false;for (int i = 0; i < m_FontUpdateList.Count; i++){FontUpdateNode node = m_FontUpdateList[i];if (node.font == font){node.Validate();findThisFont = true;break;}}if (!findThisFont){m_FontUpdateList.Add(new FontUpdateNode(font));}}//void OnGUI()//{//    if (GUI.Button(new Rect(30.0f, 50.0f, 200.0f, 50.0f), "Force Update Text"))//    {//        for (int i = 0; i < m_FontUpdateList.Count; i++)//        {//            Font font = m_FontUpdateList[i].font;//            m_RebuildForFont.Invoke(null, new object[] { font });//            Debug.Log(string.Format("Force rebuild text for font \"{0}\".", font.name));//        }//        Debug.Log("Force rebuild all text ok!");//    }//}
}
复制代码

  为了验证确实是 FontTexture 是 ok 的而乱码只是 Text 的 uv 不正确,可以将 OnGUI 的代码放开,将 LateUpdate 的代码注释,然后运行游戏,在出现字体乱码后点击 “Force Update Text” 按钮,如果文字乱码立即消失,就证实了上面的猜测仅仅是 Text UV 没有更新而已。经过在手机上实际测试出现乱码后立即点击按钮,文字均显示正常,也证实了这个问题。

  使用时在初始场景中新建一个空 GameObject,然后 DontDestroyOnLoad,再挂上 DynamicFontTextureRebuildTracker 脚本即可。后来游戏中(ios, android)就再也没有出现过字体花屏乱码等现象。

  最后附上该脚本下载地址:http://pan.baidu.com/s/1c1LPoJY


2017-07-01 更新:

  最近我们项目的 Unity 版本一直稳定在 5.3.7p4,但是极少数情况下(甚至是某一小段时间内)依然偶尔出现了字体花屏,但是最近又没有了,不知道原因,有可能其它系统引起了问题。


2017-07-06 更新:

  最近测试同学报告说,最近偶尔依然出现的字体花屏不像以前一进场景就花掉,而是出现了角色单位后就变化了,进一步缩小了范围,先记录下,后面有时间研究下。

这篇关于关于 UGUI 字体花屏或乱码。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1075961

相关文章

vscode中文乱码问题,注释,终端,调试乱码一劳永逸版

忘记咋回事突然出现了乱码问题,很多方法都试了,注释乱码解决了,终端又乱码,调试窗口也乱码,最后经过本人不懈努力,终于全部解决了,现在分享给大家我的方法。 乱码的原因是各个地方用的编码格式不统一,所以把他们设成统一的utf8. 1.电脑的编码格式 开始-设置-时间和语言-语言和区域 管理语言设置-更改系统区域设置-勾选Bata版:使用utf8-确定-然后按指示重启 2.vscode

word转PDF后mathtype公式乱码以及图片分辨率降低等一系列问题|完美解决

word转PDF后mathtype公式乱码以及图片分辨率降低等一系列问题|完美解决 问题描述 最近在投一篇期刊论文,直接提交word文档,当时没有查看提交预览,一审审稿意见全是:公式乱码、公式乱码、乱码啊!!!是我大意了,第二次提交,我就决定将word文档转成PDF后再提交,避免再次出现公式乱码的问题。接着问题又来了,我利用‘文件/导出’或‘文件/另存为’的方式将word转成PDF后,发现公式

彻底解决win10系统Tomcat10控制台输出中文乱码

彻底解决Tomcat10控制台输出中文乱码 首先乱码问题的原因通俗的讲就是读的编码格式和写的解码格式不一致,比如最常见的两种中文编码UTF-8和GBK,UTF-8一个汉字占三个字节,GBK一个汉字占两个字节,所以当编码与解码格式不一致时,输出端当然无法识别这是啥,所以只能以乱码代替。 值得一提的是GBK不是国家标准编码,常用的国标有两,一个是GB2312,一个是GB18030 GB1

matplotlib中文乱码问题

在使用Matplotlib进行数据可视化的过程中,经常会遇到中文乱码的问题。显示乱码是由于编码问题导致的,而matplotlib 默认使用ASCII 编码,但是当使用pyplot时,是支持unicode编码的,只是默认字体是英文字体,导致中文无法正常显示,所以显示中文乱码。 文本使用系统默认字体、手动指定字体、使用字体管理器来解决。 一、系统默认字体(全局设置字体) 在Matplotlib中

产出文件乱码问题

产出到文件的部分繁体字字符串出现乱码 主要原因是从数据库读取的字符是GBK,产出的字符串编码设置成立GB2312,字符集部分不匹配,产出字符串的编码改成GBK后问题解决。

Tomcat控制台乱码问题已解决(2024/9/7

步骤很详细,直接上教程 问题复现: 情景一 情景二 原因简述 这是由于编码不一致引起的,Tomcat启动后默认编码UTF-8,而Windows的默认编码是GBK。因此你想让其不乱码,只需配置conf\logging.properties的编码格式即可 解决方法演示🟢 然后重新启动Tomcat即可 效果演示

解决IntelliJ IDEA 使用 TOMCAT 中文乱码问题

运行tomcat时,控制台乱码 1)打开Run/Debug Configuration,选择你的tomcat 2)然后在 Server > VM options 设置为 -Dfile.encoding=UTF-8 ,重启tomcat

【超简单】1分钟解决ppt全文字体一键设置

省流 ppt的全部字体需要在“幻灯片母版”里面,“自定义字体”去设置好标题与正文的字体之后才算全部设置完毕 “视图”---“幻灯片母版” 找到“字体”---“自定义字体” 设置好中文和西文的字体,都可以按照自己的选择来,保存即可 吐槽 之所以发这么一个基础的帖子是因为,之前全网到处搜都没看到成功设置了的,其实才发现在自定义里面得多一步这个才可以,还好早发现了,希望能

UIFrameWork-基于UGUI-如何比较设计优劣

一、简化需求 1、从界面1打开界面2,屏蔽界面1事件响应。 2、关闭界面2,恢复界面1的事件响应。 二、暴力方案 1、对象1设置屏蔽自身事件响应,对象1通知对象2显示。 2、对象1设置恢复自身事件响应,对象2通知对象1显示。 三、UIFrameWork方案 1、对象1通知管理器对象要打开的界面信息(字符串),管理器对象通知对象1屏蔽事件响应,管理器通知对象2显示。 2、对象2通知管

UGUI 背景自适应文本框

需求 UGUI背景自适应文本框UGUI背景图片随文本框长度变化 解决方案 仅文本框宽度自适应 背景节点配置: 背景节点下的Text子节点配置: 文本框宽高自适应 将Vertical Fit设置为Preferred Size 将Child Controls Size Height选项勾上