随笔 - 132  文章 - 51  trackbacks - 0
<2011年7月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

常用链接

留言簿(7)

随笔分类

随笔档案

文章分类

文章档案

cocos2d-x

OGRE

OPenGL

搜索

  •  

最新评论

阅读排行榜

评论排行榜

这里要说的不是多线程使用FreeType的功能,而是多线程导致FreeType FT_Load_Char 失败的问题,总结了一些思路,希望遇到此类问题的朋友少走些弯路

 在游戏开发的时候遇到了一种情况,每次进入游戏时,总是报FreeType FT_Load_Char 加载字形失败的一些错误,如‘任’‘踪’... 最郁闷的不是每次都出现,我以为是我使用的FreeType方法有问题

1.问:是不是FreeType加载某些字形会有失败的情况
解决方法: 我在自己的FreeType小程序上将所有失败字形的全部加载了1000000遍,NoProblem 呵呵,这说明大神们的库在一般情况下是经得住考验的,排除了这个问题,说明问题出在我们自身程序上

2. 问:既然是出现在我们的程序中,那我使用的FreeType 加载字形一定就失败了么? 我的代码是移植过来的,莫非换了个地方就发生了质变,还是我在那里处理错了?
解决方法:将其他UI的加载和逻辑全部去掉,只在GameFrameRender 中渲染加载失败的文字N遍, 结果没有任何的问题,FT_Load_Char 一如既往的正常

3.问: 莫非是UI的某个控件的错误使用导致某块内存区域写坏导致 加载字形偶然性的失败?
解决方法:将UI的使用逻辑添加好,再次测试,OK,问题在别的地方

4.问: 情况总是出现在进入游戏时,进入游戏时,只有加载地图,而加载地图在一个线程LoadMapThreadProc中执行的,和这里有关系么?
解决方法:将其他无关的代码注释掉,只保留加载地图和渲染文字... 运行...          终于崩溃了...

找到问题所在了,和多线程有关,see了下这段多线程的代码,临界区的处理还真是少啊,其中一段代码,当地图加载完毕后,会将人物传送到加载地图的指定位置,并将小地图Rrefresh()
刷新时,会将当前地图的名字出现在屏幕上
主线程:ParseText()  ...  ParseChar()  ... FT_Load_Char() ...
其他线程: ParseText()  ...  ParseChar()  ... FT_Load_Char() ...

果断将这段 LoadMapThread 中的刷新文本的函数 放到主线程中,需要刷新时和主线程通信一下... OK 没问题

总结一下:多线程同时处理FT_Load_Char结果很可能是未知的,我们一定要处理好文字多线程的处理,否则即使当前没有出现过什么问题,以后也会回来头大的回来修改的

查找错误使用的工具: VLD检测内存泄露越界  控制台和日志记录(没她不行啊。。)

posted on 2011-08-13 14:36 风轻云淡 阅读(1705) 评论(0)  编辑 收藏 引用 所属分类: FreeType

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理