不知道这种修改算不算得上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的贴图接口中并没有锁定或修改已存在的贴图内容,需要自己实现。
原始的贴图生成之后不需要修改了,现在需要经常修改,会有一定的效率损失。
今天把项目中所有使用的脚本从python替换到lua,一切看起来很美,不过最后测试的时候发现一个非常诡异的问题,具体lua语句如下:
print(“simple test: “)
print((10000 + 123456789) – 123456789)
程序打印出来的值竟然是10003,顿时被雷到了。虽然我知道lua用的是double作为基础的lua_number,但是人家已经很耐心的教育我们double是双精度类型,不会出现什么四舍五入的问题。于是打开linux上的终端运行lua进行同样的计算,这次得到的是正确的结果:10000。
想想也知道lua不会有这种低级的错误的,要不还不立刻被人骂死,于是开始找自己的问题,首先怀疑是我们的lua嵌入包裹代码的问题,仔细review了一遍代码,觉得不会影响到这么底层的问题。接着开始做实验,发现在服务器上的同样lua代码,运行的结果是正确的。经过无尽的折腾,最后发现了这么一个事实:
在directX的sdk文档里面,D3DCREATE这个条目里面有这么一条:
D3DCREATE_FPU_PRESERVE Set the precision for Direct3D floating-point calculations to the precision used by the calling thread. If you do not specify this flag, Direct3D defaults to single-precision round-to-nearest mode for two reasons:
- Double-precision mode will reduce Direct3D performance.
- Portions of Direct3D assume floating-point unit exceptions are masked; unmasking these [...]
大型的C/C++程序做到最后,bug高发的时期过去之后,一般来说会出现的问题都是很妖的。最最常见的现象就是一下几种:
调用栈全部混乱,一堆问号出现在这里,你明明知道自己编译的时候有放入符号,现在却什么信息都看不到
莫名其妙的调用了一个代码里面没有调用的函数
重复的free或者delete某块内存,然后崩溃
部分静态或者全局的数据混乱了,代码里面除了初始化就没啥地方写过他们了
莫名的某个对象的数据全部混乱了
Add following line to soffice start script
# IBUS was confilict with OOO3 under awesomedon’t know why, but add the blow
# line, everything OK then~ cheers
OOO_FORCE_DESKTOP=gnome export OOO_FORCE_DESKTOP