游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3190|回复: 4

网络游戏人物头上面的字(也就是人物的名称)也是把文

[复制链接]

75

主题

102

帖子

110

积分

注册会员

Rank: 2

积分
110
发表于 2008-11-17 10:03:00 | 显示全部楼层 |阅读模式
为什么会那么清晰呢?我看不出来它哪里有先转成贴图在渲染的痕迹。。。不过直接把文字渲染到屏幕上不是不可取的么?

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-11-17 17:10:00 | 显示全部楼层

Re:网络游戏人物头上面的字(也就是人物的名称)也是把

为什么“直接把文字渲染到屏幕上不可取”?
不少游戏都真么做啊,ID3DXFont不就是做这个的么

只要像素对齐做好了,哪种方法都可以很清楚

75

主题

102

帖子

110

积分

注册会员

Rank: 2

积分
110
 楼主| 发表于 2008-11-18 10:15:00 | 显示全部楼层

Re: Re:网络游戏人物头上面的字(也就是人物的名称)也

qrli: Re:网络游戏人物头上面的字(也就是人物的名称)也是把文字转成贴图的形式在渲染的么?

为什么“直接把文字渲染到屏幕上不可取”?
不少游戏都真么做啊,ID3DXFont不就是做这个的么

只要像素对齐做好了,哪种方法都可以很清楚



"ID3DXFont,它存在于D3DX库中,一个现成的字体类,不过对于它的处理方法……我实在不敢恭维,就引用一位大师所说的话来表达我的看法吧: 在内部实现中, ID3DXFont:rawText()函数确实做了我上面讨论的工作,先建立一张GDI兼容的位图,把文本绘制到位图上,而后把位图拷贝到纹理贴图上去,最后把纹理渲染到屏幕上。这样你就聚齐了所有的龟速的原始GDI函数,还包括了一大堆的额外开销 — 最终,这个函数比原来GDI的DrawTextEx()函数要慢上超过六倍……"

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-11-18 12:23:00 | 显示全部楼层

Re:网络游戏人物头上面的字(也就是人物的名称)也是把

那个说法是错误的

ID3DXFont是cache很多字符组合到若干个纹理里,然后从纹理一个一个字符的绘制。也就是说每个字符只复制到纹理一次,后续的使用就是简单的贴图。另外,GDI兼容位图的格式未必能和纹理匹配吧,怎么可能复制到纹理啊?乱说啊。

ID3DXFont的方法已经相当优化了,尤其对汉语这种字符量巨大的字库,他能自动优化只将最近使用过的字符放在纹理里,而不用浪费几十兆的纹理空间cache整个字库。

ID3DXFont确实对有些字体的有些字符组合会比较慢,尤其是阿拉伯语。因为这些字体的字符组合不是两个图符的简单排列,而是要变形接合的,这样就不得不为这些组合生成纹理。记得Arial字体的j连续排列也会有这个问题。

100

主题

224

帖子

238

积分

中级会员

Rank: 3Rank: 3

积分
238
发表于 2008-11-20 09:48:00 | 显示全部楼层

Re:网络游戏人物头上面的字(也就是人物的名称)也是把

ID3DXFont在新版本的据说速度还可以,不过自己做的比较下来感觉还快很多
其实做法都大致一样, 需要一个算法cache使用率高的文字拼装到大的贴图上,
需要渲染时直接索引到该贴图以及对应rect区域.
然后还有就是需要批次渲染.如果是需要排序渲染的,可以按顺序批次渲染.(实测下来,不用dynamic vb而直接用dpup会快些,具体有文章讨论过,这里不细说了)
至于怎么把文字弄到贴图上,这个可以用gdi或者freetype, 使用freetype对字体做过很多处理,在大字体时会更好看,但小字体有问题,微软的true type字体甚至在同一个字体集入矢量字体和点阵字体,当文字过小时可使用点阵字.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-20 21:16

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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