上一代2D引擎绘制中文一般采用点阵字库,文字轮廓用位(bit)保存,可以将字库做的非常小,用3D加速的2D引擎和3D引擎一般采用贴图的方式,因为多次锁定缓存再在上面画点就得不偿失了,当然也可以使用D3DXSprite,实际上使用D3DXSprite画UI效率是最高的,因为DX都替你实现了,游戏启动时注册一些字体,退出时反注册,这样就可以直接让DX画指定的TTF字体,效果非常好,唯一的缺点是提交的次数很多,在分析瓶颈时那个曲线不太好看(但是绘制的速度非常快,这个有点囧),另外D3DXSprite是很底层的,你还需要自己实现UI的逻辑。
贴图的方式绘制文字一般是用FreeType库解析TTF文件,得到轮廓(当然也可以通过其他方式获得),画到贴图上,然后UI把图贴到该贴的地方。MYGUI本身直接支持TTF文件,只要在文字资源的配置里指定编码范围就可以生成文字的贴图,但是中文文字太多,这样做启动速度太慢了,完全无法接受。所以这里我改成了需要时才生成文字的贴图,而且贴图的大小是固定的512×512,每个文字的大小由字体的配置文件指定,在绘制时同一窗口,同一张贴图上的文字,一个批次全部画完,所以效率还是相当不错的(当然还可以再优化,所有的窗口,只要是同一张贴图的文字,全都在一个批次内画完)。
以下是我已经实现的文字效果:
1.多种字体多种大小,均不模糊
2.完美的描边效果,无论哪种字体,边描的都很漂亮:)
3.下划线效果
4.任意颜色
5.图文混排,表情动画可以任意大小
6.文字内容可以任意选择,光标位置等完全正确
![在新窗口打开图片](http://www.mobilegamebase.com/blog/attachments/month_1008/g201082620339.png)
效率方面:下面这张图有100个窗口(每个窗口都是各种文字效果混合),DEBUG版,ATI Radeon X1300/X1550板载显卡,可以跑到20帧,已经相当不错了,一般网游UI的量不会比这个多。
![在新窗口打开图片](http://www.mobilegamebase.com/blog/attachments/month_1008/l2010826203324.png)
实现思路:
描边,斜体:做法也很简单,可以从TTF文件中获得文字的相关效果,跟普通的画法一样画就行了。
下划线:其实也是一个文字,从TTF里得到下划线相对于文字的位置,然后再画到正确的位置就可以了。
多种颜色:MYGUI本身就支持的,稍微扩展一下就可以实现富文本,但是MYGUI这个地方写得有一点点小瑕疵,因为文字颜色的规则它写在了两个地方,做扩充的时候要注意下:)
图文混排:就是MYGUI多种颜色的扩充,解析文本的时候为表情空出适当的位置,然后生成一个StaticImage放在那就可以了(MYGUI的StaticImage完全可以做Animation Image)。
总结一下,MyGui用起来很爽:)