项目使用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 文字破碎相关推荐

  1. ps制作20种特效文字_如何使用AE制作文字破碎动画?制作ae破碎文字特效教程分享...

    如何使用使用AE制作文字破碎动画呢?今天macw小编为大家带来了制作ae破碎文字特效教程,一起来看看吧! 1.新建一个合成,选择自己想要的大小并命名. (快捷键:command + N ) 2.新建一 ...

  2. ae中心点重置工具_如何使用AE制作文字破碎动画?制作ae破碎文字特效教程分享...

    如何使用使用AE制作文字破碎动画呢?今天小编为大家带来了制作ae破碎文字特效教程,一起来看看吧! 1.新建一个合成,选择自己想要的大小并命名. (快捷键:command + N ) 2.新建一个纯色图 ...

  3. css代码文字破碎js特效

    下载地址 css代码文字破碎特效,通过伪元素和CSS3帧动画来实现文字震动之后,碎裂开来的效果. dd:

  4. 如何使用AE制作文字破碎动画?制作ae破碎文字特效教程分享

    如何使用使用AE制作文字破碎动画呢?今天macw小编为大家带来了制作ae破碎文字特效教程,一起来看看吧! 1.新建一个合成,选择自己想要的大小并命名. (快捷键:command + N ) 2.新建一 ...

  5. ae破碎效果在哪_AE教程 | 五分钟制作文字破碎效果

    原标题:AE教程 | 五分钟制作文字破碎效果 UBOOK知识在线 一个很认真的知识分享平台 愚人节快乐呀,亲爱的同学们- 今天又到了CC老师的AE小课堂啦,今天给大家带来的是一个很棒的特效效果--破碎 ...

  6. MGD 调试 Lives2d 文字破碎问题 (MX2)

    今天把FreeType加入到Lives2D中,在Win上表现正常,但是在Android上面,文字一闪而过,然后就糊掉了,猜测是Texture被损坏,于是计划用MGD来调试GLES查看具体问题. MGD ...

  7. 如何用ae制作文字破碎效果

    有时候,我们看到这样的视频,文字破碎效果,那么这样的视频如何制作呢?今天给大家带来了ae教程:用ae制作文字破碎效果. 那就直接开始吧,具体步骤如下: 1.新建一个合成,选择自己想要的大小并命名. ( ...

  8. Unity动态字体文字破碎的解决方法(Dynamic Font Broken)

    转载自:http://blog.csdn.net/langresser_king/article/details/22095235 使用Unity的动态字体绘制文字的时候,打开两个ui界面的时候,后面 ...

  9. iOS UIlabel文字排版(改变字间距行间距)分类

    在iOS开发中经常会用到UIlabel来展示一些文字性的内容,但是默认的文字排版会觉得有些挤,为了更美观也更易于阅读我们可以通过某些方法将UIlabel的行间距和字间距按照需要调节. 比如一个Labe ...

最新文章

  1. vscode从原有分支上新建_GitHub+VSCode 打造稳定、快速、高效、免费图床
  2. Vue中怎样获取json文件中的数据
  3. 怎么看到方法内引用方法的注释_网页内文字无法复制怎么办?一分钟看懂这些方法,让你随意复制...
  4. python实现二叉搜索树_python实现二叉查找树
  5. nebula模拟器_nebula模拟器中文金手指版本
  6. Enterprise Library Step By Step系列(十六):使用AppSetting Application Block
  7. centos卸载不必要的程序_新手教程:从Mac上的启动台Launchpad删除应用程序
  8. 6.2(求一个整数各位数字之和)
  9. RTI_DDS自定义插件开发 6 方法
  10. 如何用50块钱在学校吃一个月
  11. 学神经网络需要什么基础,神经网络需要什么基础
  12. 【JavaWeb】Filter案例:登录验证、敏感词汇过滤
  13. 面试官问如何优化慢 SQL ?(附两万字SQL面试题)
  14. QML入门教程(1): Qt Quick与QML介绍
  15. 撒金币动画android,Anime Gacha
  16. 图像处理研究中心系统 包含去噪 蜕变 去痘痘等操作
  17. linux文件fflush,Linux fflush 与 fsync的区别
  18. POI获取Excel单元格的值
  19. u3d 镜面反射的效果
  20. Android学习-指南针(方向传感器)

热门文章

  1. Access 与SQL数据类型
  2. Linux模块编程-Linux(17)
  3. 冰糖葫芦的php代码,食物语冰糖葫芦技能一览
  4. js基础知识ajax与cors
  5. 必须学会看官方的英文文档资料等
  6. 中秋节图案 用java代码打出来_以下哪个不是中秋节传说?
  7. 周杰伦根本不需要流量!!!
  8. 非对称加密BTC算法面试题
  9. Python 就业方向以及就业岗位,你都了解吗?
  10. 广州线下python培训