关于 UGUI 字体花屏或乱码
转自:http://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 有问题(没有更新),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)就再也没有出现过字体花屏乱码等现象。
关于 UGUI 字体花屏或乱码相关推荐
- 关于 UGUI 字体花屏或乱码。
转自:www.cnblogs.com/yaukey/p/unity_ugui_font_texture_uv_wrong.html 我们项目从某个时候开始ui突然开始出现字体花屏现象(unity 开发 ...
- Unity Text字体花屏
今天我同事说在老项目用的是unity4.7.2打包发布韩文和泰文,偶尔会出现字体花屏的问题,但是中文是好的.(我也不知道怎么解释,只能靠猜吧)我们用的TTF动态字体,Text每次赋值的时候Unity会 ...
- android 字体花屏,Android bug——Launcher 0x506导致花屏问题
现象描述: 在Android4.4中,概率极高会出现Launcher或者应用整个绘制成花屏.黑屏或者字体绘制成方块等问题,出现花屏问题的时候将会在hwui中打印0x506的错误. 分析: 通过log发 ...
- Unity的动态字库字体超出字库图片尺寸导致字体花屏
转载自:http://www.cnblogs.com/bicker/p/3669176.html 在我们游戏的开发过程中,在部分手机上运行游戏的时候,出现了字体丢失的问题,出问题的手机似乎用的都是高通 ...
- 计算机开机显示花屏,电脑开机出现花屏乱码怎么办? 解决电脑乱码问题
花屏时全是乱码. 乱码就是:那些英文字母全变了样,本来是个A的成了其它的字母,还有就是中间一线的字母本来是黑底白字的,结果成了黑底红字.CMOS里面更是乱了,不仅字母乱七八糟,而且边框的线也成了字母, ...
- 计算机开机显示花屏,电脑开机乱码花屏故障,动动手或就解决
原标题:电脑开机乱码花屏故障,动动手或就解决 电脑开机时乱码花屏,是什么个情况?请欣赏: 看了这些图我相信大家已经了解了我说的电脑开机出现乱码花屏是什么了. 我想很多朋友可能都遇到过这样的状况,电脑在 ...
- 关于OLED花屏的解决方案之一
一两年前买了一个OLED模块,当时跑了个例程能正常显示就放着不管,前几天拿出来玩玩怎么搞都是花屏,如下图. 一开始以为是OLED初始化的问题,在网上搜了好几个版本的初始化代码都不行. 然后以为是iic ...
- 显示器花屏故障分析与排除
经常使用电脑的朋友,也许都遇到过显示器花屏的故障.由于显示器花屏故障出现的机率并不特别高,且产生的原因也比较复杂,不同的原因所产生的花屏表现也有所不同,因此在排除起来比较麻烦.如果显示器边角部出现变色 ...
- linux系统屏幕花屏,解决Virtual Pc下Linux花屏(屏幕显示不正常)
用一些老版本,如RedHatLinux9.0的朋友可以参考下. 网上资料很多,但有的对有的不对,有的详细有的少了看似简单的步骤,偶解决完这个问题赶紧写下来,一是为以后怕忘了,二是也各大家作个参考,少走 ...
最新文章
- 新型智能电视攻击,9成国外设备或受影响
- NLP中的自监督表示学习,全是动图,很过瘾的
- Systemd:再一次的,回归第一进程
- Google Map API V3调用arcgis发布的瓦片地图服务
- [html] 隐藏div内文字的方法有哪些?
- [css] 请问display:inline-block在什么时候会显示间隙?
- ApiController得到服务器端绝对路径
- DFB [03] 移植遇到的实际问题 基于某著名平台
- openstack nova 手动修改虚拟机状态
- 华为Mate 30 Pro保护壳生产线谍照曝光:长方形摄像头模组实锤?
- 迭代总结(随时更新)
- 单元测试/集成测试/系统测试的区别
- 658. 一元二次方程公式
- 如何利用python求导数(微分)和积分
- 2022-2027年中国酸性蛋白酶行业发展前景及投资战略咨询报告
- 蚂蚁花呗账单分期和交易分期的费用如何计算?
- 移动文件后图标变白解决方法
- iOS16锁屏可定制,WPS回应“删除用户本地文件”,紫光集团重整阶段即将收官,今日更多大新闻在此...
- 篮球比赛24秒能不能用计算机控制,请问篮球24秒倒计时牌哪家是全金属面板的?...
- 计算机考研951,清华大学2020,考研专业课951最高分经验分享