网页功能: 加入收藏 设为首页 网站搜索  
如何用D3D/OpenGL在制作2D游戏中高效地显示文字
发表日期:2007-01-16作者:[转贴] 出处:  


  废话一句,很久很久记不起与大家分享所学的经验了,主要是怕自己学的东西不彻底,写出的东西容易误导人:),也就很久没有写过什么东西啦~,在用d3d/opengl制作2d游戏的时候,遇到问题最多的还是在于文字的显示。今天就把个人所遇到的问题和解决办法与大家分享一下。

  在GDI/DDraw中,显示文字不是什么麻烦事情,大不了TextOut( hdc,...)就可以解决,速度也不会慢到哪儿去,实在不行也可以自己定义字库往ddraw的locked backbuffer里面直接写数据,这里就不多说了。在d3d中,往device里面的backbuffer直接写数据显然是不明智的,那将会造成性能的急剧下降(不用多说了吧,如果lock了显存的buffer,县卡其他操作就会暂停下来),而d3d本身提供的ID3DXFont这个类确实不敢恭维(DirectX9.0C以上例外),恐怕用过的人都深有体会了~~这里也就不多说了,当然DX9.0C对这个做了很大的优化,速度比以前简直不是一个数量级的就不用多说了。下面来谈谈我的做法。

  *以下方法都是基于点阵字库处理,TrueType字体本文不考虑

  解决方法一:创建一个足够大的纹理(比如县卡支持的最大纹理),在纹理中使用buffer机制,把文字的数据写到纹理上去,一般来说是不可能把所有文字都写上去的(e文only除外)。所以就要用一种机制,把最常用的文字数据放到纹理中,显示的时候,只要把相应的纹理坐标计算出来就可以了。如果使这种解决办法的效率达到最高就看各人的算法了,管理纹理中文字数据的方法比如可以用LRU算法也比较好。事实证明这种方法可行。

  解决方法二:使用dos下的hzk字体文件,比如hzk16(ASCII16同理),由于字库的编码范围为A1A1-F7FE ,一共也就(F7-A1)*(FE-A1) = 1F3E = 7998个字符,按照每个字符大小16x16来计算。如果创建大小为256x256的纹理(该大小的纹理贴图速度据说是最快的),则每个纹理可以容纳256个字符,这样算下来,hzk16需要7998 / 256 = 31.25个纹理,如果纹理格式为a4r4g4b4来算的话,占用的内存为 32 * 256*256*(16/8) = 4M,这个应该不算是很大的容量,所以,如果把hzk16的数据全部放入这32张纹理中的话,从内存消耗上来说是可以接受的,当然纹理贴图的速度就不用说了~,具体的做法也很简单,预先把hzk中的字模数据写到32个纹理中去,(自己定义纹理坐标-〉文字的map规则) 这种方法的优点很明显,速度。当然也有缺点,hzk没有容纳足够多的字符.
 
  解决方法三:预先把Windows里面的truetype字库的所有字符数据转换成自己定义大小的点阵字库(这个转换方法最简单的是在某个设备上(比如DC)显示所有字符,从设备中得到字符的字模数据,然后按照自己定义的字库规范写入),在d3d中使用的时候,创建一个vertexbuffer,显示文字的时候就根据字模信息往vertexbuffer里面填数据,vb满了后就DrawPrimitive pointlist,继续填充。。。这种方法的速度比较快,而且占用的内存也不多(我定义的16x16大小的字库也就1M大),至于效率就要看vb的大小了,据我的经验1024-2048的范围能达到最优水平。

  以上几种方法都可以完全遗址到OpenGL中,这里就不再陈述了。

  这里给出上面说的显示文字的方法2和3的
例子以及源代码(需要dx8.0sdk编译,注意,在dx9.0C的SDK下编译会有问题),各位如果有其他更好的解决办法还请不吝赐教。

我的mail : game-diy@163.com
OICQ : 30784290
kylinx, 2004/12/18于无聊中.
我来说两句】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 如何用D3D/OpenGL在制作2D游戏中高效地显示文字
本类热点文章
  如何用D3D/OpenGL在制作2D游戏中高效地..
  自己绘制True type font字体
  使用CPU时间戳进行高精度计时
  阵汉字显示
  程序员的超强外挂——Visual Assist .N..
  用VC++实现console程序显示彩色文本 wx..
  制做自己的点阵字库的方法和程序
  “变速齿轮”再研究
  一个简单的线程管理机制
  VC编程中常用快捷键
  Delpih中的Windows API编程初步
  BIG5到GB的转换技术
最新分类信息我要发布 
最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放  
Copyright ©2003-2024 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.00393