不知道这种修改算不算得上Hack,为了能让CEGUI在亚洲系字体上能有更好的表现,需要将他的字体模块的缓冲机制(主要是Freetype字体类型)做一个比较大的修改,主要修改的内容如下:
初始化时间过长
CEGUI在初始化的时候,会便利一个字体中所有的Glyph,并在d_cp_map容器中初始化所有的FontGlyph对象。这个在英文字体下没有什么问题,因为一个字体中大约只有几百Glyph,但是在中文字体中这个值一般是65535个,所以初始化的时间过长。准备废除这个初始化的过程。
CEGUI使用一个bitmap,d_glyphPageLoaded作为一个codepoint有没有载入的标志,在这里废弃这个变量,直接使用d_cp_map容器中有没有对应的FontGlyph对象作为这个codepoint有没有载入的标志。
字体缓冲的贴图占用过多
CEGUI中的字体缓冲有一个算法,就是把字体中的Glyph分页,每个页是256个文字,一旦要渲染一个文字的时候,就把这个文字前后一共256个Glyph都渲染到一张贴图上。对于英文字体来说这样不是问题,一个字体最多渲染5到6张贴图就完事了,而且采用这种策略渲染好的贴图就不需要修改了。但是对于中文字体来说这不是一个好的策略,中文字体中文字个数繁多,而且不是采用使用频率在字体中排列的,你渲染的一个文字的前后255个文字说不定在整个过程中就不会使用得到,如果讨论在极端情况下,一个中文字体一共需要65535/256=256张贴图才可以完整的渲染完,这样我们可怜的显存里面就全部都是文字了,明显不可以接受。
计划使用一个简单的缓冲机制,就是一开始设定好一个字体可以使用多少张缓冲贴图,和每张贴图的尺寸(这里暂定512*512)。这样的策略实现起来比较简单,相对来说修改的代码量也不是很大,缺点是:
CEGUI的贴图接口中并没有锁定或修改已存在的贴图内容,需要自己实现。
原始的贴图生成之后不需要修改了,现在需要经常修改,会有一定的效率损失。