分享
 
 
 

如何用D3D/OpenGL在制作2D游戏中高效地显示文字

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

废话一句,很久很久记不起与大家分享所学的经验了,主要是怕自己学的东西不彻底,写出的东西容易误导人:),也就很久没有写过什么东西啦~,在用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下编译会有问题),各位如果有其他更好的解决办法还请不吝赐教。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有