【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 4044|回复: 9

[ DirextX->D3DXSprite ] 效率终极讨论

[复制链接]
发表于 2006-6-13 10:17:23 | 显示全部楼层 |阅读模式

D3DXSprite做为D3D9里面一个非常好用的接口,一直以来被我用来完成所有的2D绘制工作

但是,为了开发更快的2D绘制引擎,我决定考虑一下它的效率问题

用过 sprite 的就知道,它一次只能绘制一个 tile(这里用tile代表一个纹理,或者一个纹理中的某个矩形区域),那么大家看看现在的2D游戏,每一屏(每一次刷新)一般要绘制多少个tile????

大家应该心理有数吧,我就暂且定为 1000-2000 个,那么也就意味着我们要调用“sprite->Draw”这个方法 1000-2000 次,这个时候你的FPS是多少呢???(大家心理也应该有个底吧,反正我是做过很多次测试了,我的机器跑上天也就60)

也许你要说:“那是你的机器太破啦~~~~~~~~~~~”

但是请你不要忘记,写游戏的目的,并不是让它在好机器上跑的流畅。而是让它在尽可能多的用户的机器上跑得流畅。这也是我写游戏一直的目标(如果你不是,那你看到这里就够了,去看别的主题吧。。。。)

造成这种状况的目的很清楚,并不是你的机器不好,而是多次调用“sprite->Draw”,让你的显卡GPU几乎处于闲置状态.

要解决这个问题,我们可以使用D3D中的 Vertex buffer

但是我又不想放弃 sprite 。因为它可以使我们的2D游戏算法最大的简单化。

我也曾经看过,sprite可以一次绘制多个tile,可是忘记在哪里看的了,那篇文章上也没说怎么实现。

如果有知道的,请马上告诉我。。。。。。。。。。。

我舍不得的SPRITE哦~~~~~~~~~~~~~~~~

[em07][em07][em07][em07][em07]
 楼主| 发表于 2006-6-17 10:37:08 | 显示全部楼层
sprite肯定还是要用的,比如游戏中走动的人物,就肯定要用sprite,用Vertex Buffer比较适合绘制相对不动的对象,比如2D地图
 楼主| 发表于 2006-6-13 11:06:19 | 显示全部楼层

我决定使用Vertex buffer了,用算法复杂度换取游戏速度~~~~~~

我的白头发啊~~~~~~~~~~~~~~~~~~~~~~~

[em07][em07][em07][em07][em07][em07][em07][em07]
发表于 2006-6-13 13:12:29 | 显示全部楼层
怎么换的?
 楼主| 发表于 2006-6-14 13:44:03 | 显示全部楼层

你的问题好模糊啊。。。

什么怎么换的啊???

你要问什么???

发表于 2006-6-14 16:36:30 | 显示全部楼层
Vertex buffer怎么就比Spirte快了?
 楼主| 发表于 2006-6-15 09:32:34 | 显示全部楼层

很简单,因为VERTEX BUFFER画一屏的2D地图,只需要调用一次 “DrawPrimitive”,而sprite每画一次地图上的小“瓷砖”就要调用一次“DrawPrimitive”,有多少个小“瓷砖”,它就要“DrawPrimitive”几次。

3D模型都是用的VERTEX BUFFER,你可以想象一下,一个模型有多少个三角形组成??

如果用spirte去填充这些三角形,速度会怎么样??

如果你把一个模型拉成一个平面,它不就是一张2D地图了吗???

[em04][em04][em04][em04][em04][em04][em04]
发表于 2006-6-15 14:00:56 | 显示全部楼层

原来是这么个做法。不错的想法!

不过从另外一个角度想,这样可以节省资源,微软保留sprite的意义岂不时很尴尬?

发表于 2006-6-28 11:14:49 | 显示全部楼层

“因为VERTEX BUFFER画一屏的2D地图,只需要调用一次”?是什么意思,是一个vertex buffer中的所有的点只需调用一次DrawPrimitive就搞定了吗,这是用TRIANGLELIST吗?或者是整个地图只是一幅图,load到一个texture里面再调用DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 2)?如果是这样的话,sprite画一张texture也是调用一次而已。也欢迎来这里讨论一下:

http://forum.exceedu.com/forum/dispbbs.asp?boardID=46&ID=7386&page=1

[此贴子已经被作者于2006-6-30 15:30:33编辑过]
发表于 2006-12-7 00:07:35 | 显示全部楼层

我是新手 随便发表一下意见。

DrawPrimitive(...)固然可以一次画出N个三角形,但是关于地面的纹理呢?

难道人物脚下材的纹理在同一 屏幕内都是一样的么?

所以你再绘制每个三角形组成的矩形之前不是要设置贴图的么。

[此贴子已经被作者于2006-12-7 20:36:42编辑过]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-2-6 06:48

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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