|
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也是影响速度的东西.
|
|