最近的项目遇到一个问题,在ARM上显示一串文字有时候需要半秒以上才能显示出来,这速度显然不对劲,最后一步步跟踪代码才发现是freetype的bug造成的。
使用的freetype版本:freetype-2.12.1.tar.gz
下载地址:https://udomain.dl.sourceforge.net/project/freetype/freetype2/2.12.1/freetype-2.12.1.tar.gz
代码跟踪到ftccache.c的ftc_cache_add函数,发现manager->cur_weight并没有被初始化,此变量用于记录当前的cache空间已使用了多少。如果已使用的空间大于等于设定的最大值,那就对cache数据进行压缩。搜索了整个freetype项目的代码发现cur_weight确实由始至终并没有被初始化,所以它是个不确定的值,这造成cur_weight的值有可能大于max_weight,于是每渲染一个文字都会触发一次数据压缩算法,这会导致消耗大量的CPU时间,最终造成在界面上显示字符串非常慢!
解决办法:
在ftcmanag.c的FTC_Manager_New函数manager->max_weight = max_bytes;下面添加一句manager->cur_weight = 0;就可以。
另外,在解决了这个bug之后,才发现github上的2.12.1版本已经修复了这个bug。sourceforge.net上的2.12.1版本压缩包是5月份的,github上的是8月份修复这个bug的。早知道直接在github上下载就好了,白忙了大半天!!