NGUI UILabel 文字破碎
项目使用NGUI,最近碰到 Loading界面的提示文字破碎的Bug。
参考了以下文章
http://blog.csdn.net/langresser_king/article/details/22095235
转自http://blog.csdn.net/huutu http://www.liveslives.com
下面先来了解一下为什么会出现这种问题。
需要了解的是 NGUI的UILabel使用的是Unity 提供的Font 来作为字体的输入。
Unity对字体的生成是很节约的,这是很正常的,引擎应该都是这样。
(1) 在Loading界面的 UILabel 上显示 加载中 这三个字,那么Unity就会生成这三个字的纹理,128x128 的FontTexture应该够了。然后UILabel根据Font 去取每个字的图形。
(2)然后 再打开一个界面,而这个界面上有很多字时,128x128的FontTexture 就不够了,Unity会产生一张新的FontTexture,并且扔出一个回调。
(3)然后 NGUI的UILabel中处理这个回调,遍历所有UILabel,把UILabel的内容全部Push到Font里面去生成新的文字图形到FontTexture。
static BetterList<UILabel> mList = new BetterList<UILabel>();
protected override void OnInit ()
{base.OnInit();mList.Add(this);SetActiveFont(trueTypeFont);
}
//每次新建一个UILabel,都会读取UILabel上面的内容,在FontTexture上添加一块字体纹理。当FontTexture超过了原来的大小时,就会抛弃原来的FontTexture,用一个新的FontTexture,然后遍历所有的UILabel,往新的FontTexture上添加字体纹理。
static void OnFontTextureChanged ()
{for (int i = 0; i < mList.size; ++i){UILabel lbl = mList[i];if (lbl != null){Font fnt = lbl.trueTypeFont;if (fnt != null){fnt.RequestCharactersInTexture(lbl.mText, lbl.mPrintedSize, lbl.mFontStyle);}}}//这段代码让UILabel重新读取UV 重新渲染,下一帧文字就是正常的了for (int i = 0; i < mList.size; ++i){UILabel lbl = mList[i];if (lbl != null){Font fnt = lbl.trueTypeFont;if (fnt != null){lbl.RemoveFromPanel();lbl.CreatePanel();}}}
}
(4)最后UILabel被重新渲染。
字体破碎的情况,就出现在 (2) 这里,UILabel 已经在渲染 进行时,然后Unity生成了一个新的FontTexture,这样 当前帧 显示出来的图形肯定是有问题的。
那么解决方法就是,在一开始的时候,就给Font 足够多的文字,包括游戏里面所有的字都Push进去,这样以后游戏里面都不用再Push了,FontTexture就可以用到老。
转自http://blog.csdn.net/huutu http://www.liveslives.com
在UILabel 中新增函数
private static void DynamicFontBrokenFix(Font fnt){if(fnt==null){return;}if(fnt.characterInfo.Length<500){string tmpStr = Resources.Load<TextAsset>("DynamicFontBrokenFix").text;fnt.RequestCharactersInTexture(tmpStr, 32);}}
然后在设置字体的时候调用
protected void SetActiveFont (Font fnt){if (mActiveTTF != fnt){if (mActiveTTF != null){int usage;if (mFontUsage.TryGetValue(mActiveTTF, out usage)){usage = Mathf.Max(0, --usage);if (usage == 0){mActiveTTF.textureRebuildCallback = null;mFontUsage.Remove(mActiveTTF);}else mFontUsage[mActiveTTF] = usage;}else mActiveTTF.textureRebuildCallback = null;}mActiveTTF = fnt;DynamicFontBrokenFix(mActiveTTF);if (mActiveTTF != null){int usage = 0;// Font hasn't been used yet? Register a change delegate callbackif (!mFontUsage.TryGetValue(mActiveTTF, out usage))mActiveTTF.textureRebuildCallback = OnFontTextureChanged;
#if UNITY_FLASHmFontUsage[mActiveTTF] = usage + 1;
#elsemFontUsage[mActiveTTF] = ++usage;
#endif}}}
DynamicFontBrokenFix 是一个文本,里面存放游戏中所有的字。
转自http://blog.csdn.net/huutu http://www.liveslives.com
意识到 这也是一个优化点,避免多次生成 FontTexture 。
NGUI UILabel 文字破碎相关推荐
- ps制作20种特效文字_如何使用AE制作文字破碎动画?制作ae破碎文字特效教程分享...
如何使用使用AE制作文字破碎动画呢?今天macw小编为大家带来了制作ae破碎文字特效教程,一起来看看吧! 1.新建一个合成,选择自己想要的大小并命名. (快捷键:command + N ) 2.新建一 ...
- ae中心点重置工具_如何使用AE制作文字破碎动画?制作ae破碎文字特效教程分享...
如何使用使用AE制作文字破碎动画呢?今天小编为大家带来了制作ae破碎文字特效教程,一起来看看吧! 1.新建一个合成,选择自己想要的大小并命名. (快捷键:command + N ) 2.新建一个纯色图 ...
- css代码文字破碎js特效
下载地址 css代码文字破碎特效,通过伪元素和CSS3帧动画来实现文字震动之后,碎裂开来的效果. dd:
- 如何使用AE制作文字破碎动画?制作ae破碎文字特效教程分享
如何使用使用AE制作文字破碎动画呢?今天macw小编为大家带来了制作ae破碎文字特效教程,一起来看看吧! 1.新建一个合成,选择自己想要的大小并命名. (快捷键:command + N ) 2.新建一 ...
- ae破碎效果在哪_AE教程 | 五分钟制作文字破碎效果
原标题:AE教程 | 五分钟制作文字破碎效果 UBOOK知识在线 一个很认真的知识分享平台 愚人节快乐呀,亲爱的同学们- 今天又到了CC老师的AE小课堂啦,今天给大家带来的是一个很棒的特效效果--破碎 ...
- MGD 调试 Lives2d 文字破碎问题 (MX2)
今天把FreeType加入到Lives2D中,在Win上表现正常,但是在Android上面,文字一闪而过,然后就糊掉了,猜测是Texture被损坏,于是计划用MGD来调试GLES查看具体问题. MGD ...
- 如何用ae制作文字破碎效果
有时候,我们看到这样的视频,文字破碎效果,那么这样的视频如何制作呢?今天给大家带来了ae教程:用ae制作文字破碎效果. 那就直接开始吧,具体步骤如下: 1.新建一个合成,选择自己想要的大小并命名. ( ...
- Unity动态字体文字破碎的解决方法(Dynamic Font Broken)
转载自:http://blog.csdn.net/langresser_king/article/details/22095235 使用Unity的动态字体绘制文字的时候,打开两个ui界面的时候,后面 ...
- iOS UIlabel文字排版(改变字间距行间距)分类
在iOS开发中经常会用到UIlabel来展示一些文字性的内容,但是默认的文字排版会觉得有些挤,为了更美观也更易于阅读我们可以通过某些方法将UIlabel的行间距和字间距按照需要调节. 比如一个Labe ...
最新文章
- vscode从原有分支上新建_GitHub+VSCode 打造稳定、快速、高效、免费图床
- Vue中怎样获取json文件中的数据
- 怎么看到方法内引用方法的注释_网页内文字无法复制怎么办?一分钟看懂这些方法,让你随意复制...
- python实现二叉搜索树_python实现二叉查找树
- nebula模拟器_nebula模拟器中文金手指版本
- Enterprise Library Step By Step系列(十六):使用AppSetting Application Block
- centos卸载不必要的程序_新手教程:从Mac上的启动台Launchpad删除应用程序
- 6.2(求一个整数各位数字之和)
- RTI_DDS自定义插件开发 6 方法
- 如何用50块钱在学校吃一个月
- 学神经网络需要什么基础,神经网络需要什么基础
- 【JavaWeb】Filter案例:登录验证、敏感词汇过滤
- 面试官问如何优化慢 SQL ?(附两万字SQL面试题)
- QML入门教程(1): Qt Quick与QML介绍
- 撒金币动画android,Anime Gacha
- 图像处理研究中心系统 包含去噪 蜕变 去痘痘等操作
- linux文件fflush,Linux fflush 与 fsync的区别
- POI获取Excel单元格的值
- u3d 镜面反射的效果
- Android学习-指南针(方向传感器)