游戏开发论坛

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

DirectDraw性能分析(一)

[复制链接]

41

主题

148

帖子

184

积分

注册会员

Rank: 2

积分
184
QQ
发表于 2003-12-26 17:20:00 | 显示全部楼层 |阅读模式
DirectDraw其实就是模拟了显卡的2D部分功能,最重要的就是数据传输功能,也就是BLT(),我们在屏幕上画图,其实就是改变数据的内容.数据可以放在现存里(即创建页面时指定VIDEOMEMORY),也可以放在SYSTEMMEMORY里,我们用DD提供的Blt(),是不会去在意数据传输效率问题的,当你自己写带数据运算的"Blt()"时,就不得不注意效率了.你有没发现有时候同样的算法,会有不同的速度?
在程序中,我们对数据进行操作,可能是V对V, V对S, S对S,(V代表数据在显存中,S代表数据在内存中).这就是影响速度的关键因素.
如果我们用BLT,V对V是最快的,因为他利用了显卡的高速局部总线,然后是S到S和V到S(这2个哪个快看具体系统).
如果我们不用BLT,直接访问数据,那S对S是最快的,然后是V对V, V对S.
我们用DirectDraw难免会自己写算法,比如Alpha混合.设想我们把Spirit和背景页面混合,那我们将会直接对数据进行操作,我可以肯定的说,不管你算法有多好,速度一样快不了.
在Ares引擎中,我是先把背景页面数据Blt到内存页面,然后在内存页面里混合后再Blt回去的,也许你会问:这样不是多进行了2次数据拷贝吗,速度肯定更慢了!具体性能我没测试,不过从效果看他并不慢,为什么?
首先Blt用了DMA加速,所以肯定比我们直接把显存数据移过来要快,而且是异步的,这样我们混合的同时也在传数据.
本来最近考试不想写东西了,不过一个朋友说了几次了,写的不对的地方大家指正.有问题请看看引擎里的具体做法.
对了,还有,页面的LOCK也是影响速度的东西.

21

主题

86

帖子

98

积分

注册会员

Rank: 2

积分
98
发表于 2003-12-26 18:53:00 | 显示全部楼层

Re:DirectDraw性能分析(一)

为什么都说Lock影响速度?
我怎么不觉得.

21

主题

86

帖子

98

积分

注册会员

Rank: 2

积分
98
发表于 2003-12-26 19:01:00 | 显示全部楼层

Re:DirectDraw性能分析(一)

从内存里blt回显存里很慢,我的机器如果全屏blt,S到V,50fps.V到V,200多fps,机器很烂.

41

主题

148

帖子

184

积分

注册会员

Rank: 2

积分
184
QQ
 楼主| 发表于 2003-12-27 14:55:00 | 显示全部楼层

Re: DirectDraw性能分析(一)

如果你仔细看一下DX里有关LOCK的说明,你就会知道Lock()不仅仅是得到一个数据指针这么简单的操作,他还会调用Win32Mutex,什么意思呢?学个操作系统的人都知道.SDK里解释说"在你调用LOCK的时候其他程序甚至操作系统本身都会暂时停止运行."为什么?学下操作系统里的竞争和线程就可以理解了.所以在Ares引擎中,LOCK绝对不会随便用,只在需要的时候用.

41

主题

148

帖子

184

积分

注册会员

Rank: 2

积分
184
QQ
 楼主| 发表于 2003-12-27 14:58:00 | 显示全部楼层

Re: DirectDraw性能分析(一)

关于数据移动的问题,只要你记住批量移动肯定比单个移动快,这就是为什么MMX比普通的指令更有效,Memcopy比你自己写的一个个复制的函数快.显存和内存之间,用DMA和不用DMA效果当然不能比.尤其值得注意的是,C++提供的内存复制函数比你用MMX汇编写的还要快,快在哪里,函数调用的开销.所以大家尽量用系统提供的函数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-28 05:19

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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