OGREFont的研究与OGRE的中文显示(一)引言

很久没写文章了,主要是人太懒了:-)
前面只发了一篇文章“汉字、图形,Zebra打印机完全解决方案”,不少人看了以后和我联系过。对于大部分人我都做了回复,希望对大家有些帮助。对于那些上来就直接要代码的,我只能说你太没有技术含量了:0)
言归正传,3周前公司开始为一个新的项目做调研。我们想把原来的一个产品(非游戏)从2D移植到3D,所以调研的对象是3D引擎。刚开始的几天,我们眼花缭乱的看了N个3D引擎,有开源的,有商用的,最后感觉最合适的还是OGRE。(IRRILICHT在最后被淘汰了,有机会我会写一篇OGRE与它简单的对比)
OGRE最吸引我们的还是它的设计和专注于Renderer的方式,关于它的特点我就不多介绍了,OGRE在国内还是用的很广的,有很多中文的文章,大家可以看看。
没想到,刚用OGRE没几天,就碰上个大问题,显示中文。google了半天,也没什么好结果。直接用D3DFont或Windows GDI也不是不可以,可惜效率太差了,不甘心啊,谁让我喜欢较真呢。那开始研究OGREFont的源代码吧。
相信大家现在在3D中显示文字都用truetype了吧?OGRE是支持truetype的,怎么支持的?当当当当,请大家鼓掌,热烈欢迎freetype。这个咚咚非常好用,而且它是完全免费的。虽然我们国内的opensource土壤还很贫瘠(比起国外的程序员来说大家都好穷啊,好不容易写点代码还希望能换几个钱来还信用卡 :-0)。但当我真的进入并了解OGRE、Freetype、zlib等opensource项目的时候,我才真的觉得当你免费得到时候很快乐,而当你免费付出时更快乐。因为在付出的时候,你会得到更多。
好了又扯远了。OGRE支持truetype的做法是这样的:由freetype获取文字Glyph,然后再Render到font texture,最后显示出来。好像挺简单啊。是的,但仅限于英文。对中文(也包括日文韩文等)的支持很有限。。。好像我还没看到有好的方法。就连OGRE的老大sinbad也承认这不容易。有兴趣的可以去看看我在OGRE论坛发的帖子。http://www.ogre3d.org/phpBB2/viewtopic.php?t=43787&sid=a7d59e0908680c28b337cc21cdde4fec(在研究OGREFont的过程中我发现了一些可以改进的地方)

原因是什么呢?只能说是因为中文太博大精深了:-)。显示英文所需要的Glyph掰着指头也能算清楚(ASCII那几个),中文可就不一样了,常用的也有近4000,这需要多大的texture啊。加上次常用和很少用的,要2万开外了(simsun里有2.2万多个)。我看到网上有的人把unicode中文范围内所有的codepoint加到OGRE的配置文件中,疯了,估计启动都要半天,而且OGREFont只支持单一的texture,尺寸怎么也要2048X2048了吧?估计字体还不敢设很大的尺寸和分辨率。

怎么办呢?我首先想到的是多个font texture,可是然后呢?难道要把2万多汉字在启动时全部载入?这显然不和逻辑。就算是一个即时chat系统,也不一定会用到那么多汉字。看来随需生成font texture才是最好的解决方法,效果肯定没问题,但速度怎样呢?大概测了一下freetype从load glyph到hinting到render至256位灰阶bitmap的速度还是很快的。在一台P42.8老机器上跑debug模式也在也用不了1毫秒(不知道有没有方法可以更精确)。好了,方案确定了,下面开始干活吧。我打算写一个自己的Font类,使用freetype随需生成texture,并在生成时加上格式。

请大家期待下一篇文章 - freetype2攻略

顺便说一下,这个FPS我是程序里限定在30以下的,并不是性能问题。

你可能感兴趣的:(游戏,windows,Google,OpenSource,图形,引擎)