星期四, 五月 24, 2007

关于XNA中如何显示汉字的讨论

XNA GSE beta版并没有字体显示的接口,但在游戏中字体的显示是必不可少的。下面就我收集到的关于解决这个问题的方法做一些简单讨论,我并未完整解决这个问题,所以本文只是给希望实现汉字完美显示的朋友做一个引子。
第一种方法:和显示英文的方法一样,将需要用到的汉字放入图片中,用2d texture载入,再根据一定算法显示出需要显示的汉字。这个方法的缺点是显而易见的,汉字最常用的就有1000多个,而英文只有26个字母加几个符号。是不可能同时将所以纹理同时载入内存的。对此方法的简单改进是,只把当前需要显示的字的纹理载入内存,在不用的时候适当释放,可以减轻内存压力。不过在最坏的情况下,即要显示的文字分散在很多纹理中,那么还是需要所有纹理都载入内存,仍然可能内存不足。此方法老外已经有人做了简单的实现(Creating and using bitmap fonts in XNA
第二种方法:在windows下面的XNA可以link .net的System.Drawing类,将系统里面的字体写入2d Texture,然后和第一种方法一样,将2d Texture的内容显示到屏幕上。作为cache的2d Texure可以在运行时被更新,可以运用LRU等算法管理里面的汉字,当出现cache miss的时候就用Drawing类把系统中的字体写入2d Texture,这样,只要cache miss不是很严重,游戏速度是有保证的,内存的问题也可以解决。不过用Drawing类写入Texutre的surface比较麻烦,要实现这个可以参考这篇文章(Writing to Texture Surface)。不过这个方法仅限于windows上面的开发,XBox360上面是不可以的。
第三种方法,其实不是方法,等待XNA正式版。我相信作为游戏开发RAD工具的XNA不会对于显示汉字这样一个简单问题都解决不了吧,在dx9中我们尚且可以简单的用sprite快速高效的显示汉字,XNA需要我们绕巨大一个圈子去研究这个,有背于它的初衷啊。即使XNA正式版不能,后面用TorqueX引擎这样的东西总不会再要我们自己写字体类了吧。我这样想的出发点不是想偷懒,如果是在directx下面开发,要我重新写个字体类,我觉得理所应当,但是,谁让它是XNA呢?

没有评论: