游戏开发论坛

 找回密码
 立即注册
搜索
查看: 16329|回复: 31

如何高效的在游戏中显示各种字体的汉字

[复制链接]

4

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2004-1-16 16:14:00 | 显示全部楼层 |阅读模式
看过一编文章,说在游戏中用GDI函数获得hdc,然后用TextOut()来显示中文效率很低,那么各位都是如何高效的在游戏中显示各种字体的汉字呢?

5

主题

19

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2004-1-16 18:09:00 | 显示全部楼层

Re:如何高效的在游戏中显示各种字体的汉字

可以使用Direct3D中的CD3DFONT类来显示字体
但是我是过,效率也不见得很高
要是字一多,就会严重影响fps
至于怎么用,可以参阅SDK。蛮简单的。

0

主题

12

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2004-1-17 08:39:00 | 显示全部楼层

Re:如何高效的在游戏中显示各种字体的汉字

用CD3DFont类显示英文是不错,但可惜的是,由于汉字的特殊性,CD3DFont类并不支持汉字的显示,看了一下源码,发现其实现方法很简单,在初使化的时候把某种英文字体加上其它符号共95个字符写入设备中,然后创建位图,把设备中的字体写入位图,创建一块能容纳所有英文字符的纹理,把位图内容移入纹理,最后,要显示什么字母就把相应字母的纹理座标赋予三角面组成多边形,显示多边形即把带字母纹理的正方形显示于屏幕上,由于带有Alpha值,字符被正确显示了。此方法预先把字符读入纹理,由三维加速卡完成最后的加速显示,因此还是比较快的。但是因为只读入了英文字符,因此是不可能支持中文的,除非把中文字符也全部读入纹理。
但是你要想一想,中文可不止95个字符哦,特别是大字库字符集,如果要读入纹理,一下就要占去40000个文字,如果是16*16点阵大小,16位色深,换成显存为40000*16*16*2*=204MB。就算你的显卡是256M的也吃不消啊!

3

主题

25

帖子

25

积分

注册会员

Rank: 2

积分
25
发表于 2004-1-17 09:52:00 | 显示全部楼层

Re:如何高效的在游戏中显示各种字体的汉字

用 CreateFont 来建立一个hFont.
一般在对话时,游戏没有什么大的变化。
所以影响 FPS 的问题也不是很大。(我是用 RPG 来说的。)

21

主题

86

帖子

98

积分

注册会员

Rank: 2

积分
98
发表于 2004-1-17 10:44:00 | 显示全部楼层

Re:如何高效的在游戏中显示各种字体的汉字

字体类型很重要,如果"system"类型,速度很快,其他的很慢。我也不知道"system"是什么类型,可能是宋体、楷体之类的。

24

主题

161

帖子

179

积分

注册会员

Rank: 2

积分
179
发表于 2004-1-17 17:09:00 | 显示全部楼层

Re:如何高效的在游戏中显示各种字体的汉字

你的游戏中有很多汉字吗?

如果不是,用GDI生成汉字对游戏影响并不大,除非你的算法不好

关键是:如果你用魏碑,结果目标机上没有就成了SYSTEM字体(默认为宋体)

28

主题

685

帖子

703

积分

高级会员

Rank: 4

积分
703
发表于 2004-1-17 17:40:00 | 显示全部楼层

Re:如何高效的在游戏中显示各种字体的汉字

在D3DFONT里面主要是这句话:
for( TCHAR c=32; c<127; c++ )

汉字的读取我想能不能不读到显存里面,而直接用

hr = m_pd3dDevice->CreateTexture( m_dwTexWidth, m_dwTexHeight, 1,
                                      0, D3DFMT_A4R4G4B4,
                                      D3DPOOL_MANAGED, &m_pTexture, NULL );
这里的内存设为D3DPOOL_SYSTEMMEM不知道行不行。这样应该不怎么占用显存了吧。

28

主题

685

帖子

703

积分

高级会员

Rank: 4

积分
703
发表于 2004-1-17 17:41:00 | 显示全部楼层

Re:如何高效的在游戏中显示各种字体的汉字

这个比直接textout肯定效率要高。

0

主题

12

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2004-1-17 22:36:00 | 显示全部楼层

Re:如何高效的在游戏中显示各种字体的汉字

sevencat的方法不错,我想可以采用双缓冲方法,把所有字体先读入内存纹理,然后创建一块256X256或512X512的显存纹理,把使用最频繁的字体放入显存纹理中,当显示文字时,先找显存中是否存在,如果已经存在则直接显示,如果不存在,则到内存纹理中取,这样速度也比较快,又不会太占显存.只是实现起来有点烦.

0

主题

12

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2004-1-17 22:41:00 | 显示全部楼层

Re:如何高效的在游戏中显示各种字体的汉字

如果只是少量文字,可以采取更直接的方法,就是显示一行文字就创建一块显存纹理,然后直接用三角面显示.但如果文字很多就不划算了.因为很多文字是重复的,显然浪费显存,不过速度飞快.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-8-2 21:37

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表