Unity动态字体在手机上出现字体丢失问题解决
在我们游戏的开发过程中,在部分手机上运行游戏的时候,出现了字体丢失的问题,出问题的手机似乎用的都是高通芯片。
使用的unity是4.2.0版本,ngui是3.4.9版本。
在unity的论坛及unity answer中寻找问题的原因及解决办法许久未果,后来在csdn里偶然找到一篇博文,里面讲到的问题出现的原因以及相应的解决办法。根据文中的办法,我试验后证实的确可以解决问题。
博文地址:http://blog.csdn.net/langresser_king/article/details/22095235
在unity editor中可以看到,使用的字体ttf文件下,会生成一个texture文件及material文件。当需要显示文字的时候,会通过RequestCharactersInTexture函数向Font请求更新文字信息,然后使用GetCharacterInfo获取文字信息来渲 染。在调用GetCharacterInfo的时候要保证所有文字都通过RequestCharactersInTexture请求过了。
如果请求的时候,Font内部维护的texture不够用了,就会触发textureRebuildCallback的回调,通知外部使用Font的对象,其内部的texture被更新了,外部应该重新刷新。
原文中提到,是因为texture的大小没有被及时扩大而导致字体丢失。但是在我多次测试之后,猜测问题的原因应该不是这一点。因为在PC上或者其他手机上并不会出现字体丢失的问题,问题并不是出现在unity动态字体的策略上。但是这个问题是可以通过在最开始的时候使用方法将texture尺寸扩大的做法来规避掉。真正的原因实在未能找出。
下面提供规避掉这个问题的做法,供参考:
private void FixBrokenWord()
{
if (chineseText == null)
{
var wordFileRes = ResMngr.GetInstance().LoadSync("ui", "UI/font/chineseWords");
if (wordFileRes != null)
{
TextAsset worldFile = wordFileRes.GetObject() as TextAsset;
chineseText = worldFile.text;
Debug.Log(string.Format("chinese font size: {0}", chineseText.Length));
}
}
var fontRes = ResMngr.GetInstance().LoadSync("ui", "UI/font/font_FZCYJW_28");
if (fontRes != null)
{
GameObject fontPrefab = fontRes.GetObject() as GameObject;
baseFont = fontPrefab.GetComponent<UIFont>().dynamicFont;
}
if (baseFont != null)
{
baseFont.RequestCharactersInTexture(chineseText, 28);
Texture texture = baseFont.material.mainTexture;
Debug.Log(string.Format("Texture size: {0}, {1}", texture.width, texture.height));
}
fontRes = ResMngr.GetInstance().LoadSync("ui", "UI/font/font_STXINGKA_54");
if (fontRes != null)
{
GameObject fontPrefab = fontRes.GetObject() as GameObject;
baseFont = fontPrefab.GetComponent<UIFont>().dynamicFont;
}
if (baseFont != null)
{
baseFont.RequestCharactersInTexture(chineseText, 54);
Texture texture = baseFont.material.mainTexture;
Debug.Log(string.Format("Texture size: {0}, {1}", texture.width, texture.height));
}
}
这个可以在游戏开始的时候调用一次,通过RequestCharactersInTexture函数,传入一个较大的字符串来使得unity扩大texture的大小。
另外如果游戏里所使用到的文字都是通过配置表来加入的,附送一个函数,来统计游戏中所有用到的文字,并生成上一函数需要的文字文本文件。
[MenuItem("Custom/Statistic Words")]
public static void StatisticWords()
{
//用于统计字符
Dictionary<char, int> wordMap = new Dictionary<char, int>();
string[] txtFiles = Directory.GetFiles("Assets/Resources/Data/", "*.txt");
for (int i = 0; i < txtFiles.Length; ++i)
{
Debug.Log("> open file: " + txtFiles[i]);
string textContent = File.ReadAllText(txtFiles[i], System.Text.Encoding.UTF8);
Debug.Log("> file " + txtFiles[i] + " size: " + textContent.Length);
for (int wordIndex = 0; wordIndex < textContent.Length; ++wordIndex)
{
int useCount = 0;
wordMap.TryGetValue(textContent[wordIndex], out useCount);
wordMap[textContent[wordIndex]] = useCount + 1;
}
}
Dictionary<char, int> sortedWordMap = new Dictionary<char, int>();
sortedWordMap = (from entry in wordMap
orderby entry.Value descending
select entry).ToDictionary(pair => pair.Key, pair => pair.Value);
IEnumerator enumerator = sortedWordMap.Keys.GetEnumerator();
StringBuilder sBuilder = new StringBuilder();
while (enumerator.MoveNext())
{
sBuilder.Append(string.Format("{0}:\t{1}\n", enumerator.Current,
sortedWordMap[(char)enumerator.Current]));
}
File.WriteAllText("Assets/Resources/UI/Font/sortedChineseWords.txt",
sBuilder.ToString(), Encoding.UTF8);
sBuilder = new StringBuilder();
enumerator = sortedWordMap.Keys.GetEnumerator();
int wordCount = 0;
while (enumerator.MoveNext()&&wordCount<800)
{
wordCount++;
sBuilder.Append(enumerator.Current);
}
Debug.Log("> Total word: " + sBuilder.ToString().Length);
File.WriteAllText("Assets/Resources/UI/Font/chineseWords.txt", sBuilder.ToString(),
Encoding.UTF8);
}
如果有知道unity这个丢失字体真正原因的,欢迎告知。
ps: 上文中从Resources目录里取得文本文件及font文件,用的是我们自己实现的ResMngr,可自行更换成unity原来的方法
Unity动态字体在手机上出现字体丢失问题解决的更多相关文章
- fontforge制作自定义字体及在手机上应用举例——张鑫旭
一.看似无关紧要的事件背景 之所以花时间折腾fontforge这个软件,去制作什么自定义的字体是有原因滴. 之前提过,最近我抽空将公司的手机软件HTML5网页化.期间碰到这么一个问题,页面低栏上的电话 ...
- Dynamic CRM 2013学习笔记(二十六)报表设计:Reporting Service报表 动态参数、参数多选全选、动态列、动态显示行字体颜色
上次介绍过CRM里开始报表的一些注意事项:Dynamic CRM 2013学习笔记(十五)报表入门.开发工具及注意事项,本文继续介绍报表里的一些动态效果:动态显示参数,参数是从数据库里查询出来的:参数 ...
- UNITY 优化之带Animator的Go.SetActive耗时问题,在手机上,这个问题似乎并不存在,因为优化了后手机上运行帧率并未明显提升
UNITY 优化之带Animator的Go.SetActive耗时问题,在手机上,这个问题似乎并不存在,因为优化了后手机上运行帧率并未明显提升 经确认,这个问题在手机上依然存在,不过占的比例非常小.因 ...
- 便捷的方式在手机上查看Unity3D的Console Log(调试信息)
Logs Viewer 功能描述 Using this tool you can easily check your editor console logs inside the game itsel ...
- 便捷的方式在手机上查看Unity3D的Console Log(调试信息 日志)
Logs Viewer 功能描述 Using this tool you can easily check your editor console logs inside the game itsel ...
- CSS在线字体库,外部字体的引用方法
目录: 1:CSS家族五大字体 2:360和谷歌外部字体引用方法 3:谷歌外部字体引用方法详解 4:@font-face用法详解 一: {font-family:serif,sans-serif,fa ...
- CSS在线字体库,外部字体的引用方法@font-face
@font-face是CSS3中的一个模块,他主要是把自己定义的Web字体嵌入到你的网页中,随着@font-face模块的出现,我们在Web的开发中使用字体不怕只能使用Web安全字体,你们当中或许有许 ...
- h5 audio标签在手机上不能自动播放????
最近在做一个微信端的项目,快到接近尾声的时候,发现还没放入音频,于是乎,放入音频,在电脑端测试一切正常,无阻碍. 后来在手机上测试,发现背景音乐不能播放,于是开始找错,刚开始以为是IIS服务器出错,结 ...
- [Unity][Heap sort]用Unity动态演示堆排序的过程(How Heap Sort Works)
[Unity][Heap sort]用Unity动态演示堆排序的过程 How Heap Sort Works 最近做了一个用Unity3D动态演示堆排序过程的程序. I've made this ap ...
随机推荐
- LINUX学习资源
鸟哥:http://vbird.dic.ksu.edu.tw/linux_basic/0430cron.php#cron 五分钟教程:http://roclinux.cn/?page_id=3759
- [BZOJ 1567] Blue Mary的战役地图
Link: BZOJ 1567 传送门 Solution: 矩阵Hash/二维$Hash$模板题 涉及到需要快速查询.匹配的题目,考虑直接上$Hash$ 矩阵$Hash$其实就是每行先各$Hash$一 ...
- 设置iframe高度自适应屏幕高度
写在前面: 最近在搭建项目前台页面框子的时候,把iframe设置成了固定的高度,导致不同的电脑尺寸访问的时候,高度差异较大,故查了下,将iframe设置成自动适应屏幕高度的方式,这里记录下. 还是直接 ...
- ttServer缓存的简单使用
ttserver是一款 DBM 数据库,该数据库读写非常快,哈希模式写入100万条数据只需0.643秒,读取100万条数据只需0.773秒,是 Berkeley DB 等 DBM 的几倍.利用Toky ...
- Android之9图的制作
.9.PNG确实是标准的PNG格式,只是在最外面一圈额外增加1px的边框,这个1px的边框就是用来定义图片中可扩展的和静态不变的区域.特别说明,left和top边框中交叉部分是可拉伸部分,未选中部分是 ...
- 关于spring.net的面向切面编程 (Aspect Oriented Programming with Spring.NET)-通知(Advice)API
本文翻译自Spring.NET官方文档Version 1.3.2. 受限于个人知识水平,有些地方翻译可能不准确,但是我还是希望我的这些微薄的努力能为他人提供帮助. 侵删. 让我们看看 Spring.N ...
- What is a fully qualified domain name (FQDN)?
fully qualified domain name (FQDN) is the complete domain name for a specific computer, or host, on ...
- log4j教程 9、HTMLLayout
如果想生成一个HTML格式的文件,日志信息,那么可以使用 org.apache.log4j.HTMLLayout 格式化日志信息. HTMLLayout类扩展抽象org.apache.log4j.La ...
- 使用BAT编译,链接,执行汇编代码
大家都知道汇编程序(MASM)的上机过程,先要对源代码进行汇编. 连接,然后再执行,而这中间有很多环节需要输入很多东西,麻烦的很(只有经历过的朋友才懂得).如何使这个过程变的简单呢?在我们搞汇编课程设 ...
- SQL注入的几种有用办法
一.查询表中包括有多少列: 这里以DISCUZ举例说明,例如以下 select * FROM pre_forum_thread ORDER BY 80 返回,Unknown column '80' i ...