这里要说的不是多线程使用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
风轻云淡 阅读(1691)
评论(0) 编辑 收藏 引用 所属分类:
FreeType