用Ogre MyGUI实现快速的中文绘制以及下划线描边图文混排等效果
2011-09-28 11:17
525 查看
用Ogre实现中文显示是很久远的话题了,网上最为流行的是使用CEGUI来实现,但是我用的是MYGUI。
上一代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.文字内容可以任意选择,光标位置等完全正确
效率方面:下面这张图有100个窗口(每个窗口都是各种文字效果混合),DEBUG版,ATI Radeon X1300/X1550板载显卡,可以跑到20帧,已经相当不错了,一般网游UI的量不会比这个多。
实现思路:
描边,斜体:做法也很简单,可以从TTF文件中获得文字的相关效果,跟普通的画法一样画就行了。
下划线:其实也是一个文字,从TTF里得到下划线相对于文字的位置,然后再画到正确的位置就可以了。
多种颜色:MYGUI本身就支持的,稍微扩展一下就可以实现富文本,但是MYGUI这个地方写得有一点点小瑕疵,因为文字颜色的规则它写在了两个地方,做扩充的时候要注意下:)
图文混排:就是MYGUI多种颜色的扩充,解析文本的时候为表情空出适当的位置,然后生成一个StaticImage放在那就可以了(MYGUI的StaticImage完全可以做Animation Image)。
总结一下,MyGui用起来很爽:)
上一代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.文字内容可以任意选择,光标位置等完全正确
效率方面:下面这张图有100个窗口(每个窗口都是各种文字效果混合),DEBUG版,ATI Radeon X1300/X1550板载显卡,可以跑到20帧,已经相当不错了,一般网游UI的量不会比这个多。
实现思路:
描边,斜体:做法也很简单,可以从TTF文件中获得文字的相关效果,跟普通的画法一样画就行了。
下划线:其实也是一个文字,从TTF里得到下划线相对于文字的位置,然后再画到正确的位置就可以了。
多种颜色:MYGUI本身就支持的,稍微扩展一下就可以实现富文本,但是MYGUI这个地方写得有一点点小瑕疵,因为文字颜色的规则它写在了两个地方,做扩充的时候要注意下:)
图文混排:就是MYGUI多种颜色的扩充,解析文本的时候为表情空出适当的位置,然后生成一个StaticImage放在那就可以了(MYGUI的StaticImage完全可以做Animation Image)。
总结一下,MyGui用起来很爽:)
相关文章推荐
- CEGUI 0.7x实现下划线描边图文混排等效果
- CEGUI 0.7x实现下划线描边图文混排等效果
- Android中ListView字母排序,实现字母挤压效果以及右侧快速选中字母,搜索关键字功能
- 实现谷歌商店商品列表的每个item的背景效果(底部下划线以及底部阴影的效果)
- 安卓快速实现关键字变色,搜索字变红,点击字体打电话,textview斜体,电商价格删除线,绿色下划线,图片(表情,图文混排) textview超链接跳转
- TextView中文字的跑马灯效果实现,以及focusable,focusableInTouchMode属性介绍
- TextView 数字、中文 内容的中线下划线锯齿效果实现
- 谈谈iOS中粘性动画以及果冻效果的实现
- [置顶] Android 快速实现右滑退出效果
- 关于傅里叶变换的理解、快速傅里叶算法的推导以及蝶形运算的c语言实现
- 3D角色遮挡住UI的实现,关于Stencil Buffer,描边,以及其他
- android 你所不知道的类SpannableStringBuilder的总结--实现图文混排,查看更多,下划线等等
- Android中使用Animation实现控件的动画效果以及Interpolator和AnimationListener的使用
- 浅解HDR技术以及如何实现HDR效果
- Button的几种常用的xml背景,扁平化,下划线,边框包裹,以及按压效果
- 自定义ViewGroup 实现拖动跟快速滚动的效果
- Android中文图混排时文图的居中对齐 FontMetrics以及自定义ImageSpan实现
- Android中使用Animation实现控件的动画效果以及Interpolator和AnimationListener的使用
- 利用C实现泛型(generics)效果---原地洗牌,快速排序
- 使用FreeType实现矢量字体的粗体、斜体、描边、阴影效果