hp://blog.csdn.net/langresser_king/arcle/details/22095235
Unity 动态字体文字破碎的解决方法(Dynamic Font Broken)
使用 Unity 的动态字体绘制文字的时候,打开两个 ui 界面的时候,后面的文字会显示破碎
(完全乱掉)。我使用的 ui 插件是 Daikon Forge,由于其 label 的更新机制问题,最终表
现的结果可能比一个文本显示破碎更加糟糕。很可能文本控件会不停的刷新,要打开的新
界面也显示不出来。
这个从根本上说,是由于 Unity 的 Dynamic Font 实现的不够智能。理论上 NGUI 也
会有这样的问题。只要你使用的是动态字体,并且渲染的文字构多。
NGUI 和 Daikon Forge 内部在绘制文字的时候使用了 Unity 的 Font,这个就是动态字
体。通过 RequestCharactersInTexture 函数向 Font 请求更新文字信息,然后使用
GetCharacterInfo 获取文字信息来渲染。在调用 GetCharacterInfo 的时候要保证所有文字
都通过 RequestCharactersInTexture 请求过了。
如果请求的时候,Font 内部维护的 texture 不够用了,就会触发
textureRebuildCallback 的回调,通知外部使用 Font 的对象,其内部的 texture 被更新了,
外部应该重新刷新。
Unity 的 Font 默认的 texture 大小是 256x256,在纯英文字体的情况下,是完全够用
了。但是汉字、日文等东方字体就完全不够了。而之前说的那两个插件的使用方式都是绘
制文字的时候请求一段,如果 unity 的刷新回调触发,则重新刷新所有的文本控件。这样就
非常容易出现字体破碎的情况。因为一般情况下我们一次请求的文字不会很多,使用的
texture 不会超过 256x256,unity 不会自动扩展 texture 大小。而我们在回调函数中重新刷
新字体的时候,又很容易出现 texture 不够的情况,这样就触发了另一次刷新回调。于是就
会发文本控件显示破碎而且不停刷新的情况。
直到了问题的起因,解决方法也就出来了。只要我们请求的文字足够多,那么 unity
就会内部自动扩展 texture 大小,于是就可以避免不停刷新的情况。我准备了 2000 个汉字
的文本,在请求文字信息后,内部 texture 被扩展成 1024x1024 大小,这样游戏过程中就
基本够用了。如果哪天发现这样也不够的话,再多准备一些汉字,把 texture 扩展成
2048x1024 就 ok 了。
[csharp]view plaincopy
1. staticstringchineseTxt=null;
2. publicUnityEngine.FontbaseFont;