DirectDraw GDI的区别之一

23 篇文章 0 订阅

屏幕上的显示在内存中是以下这样的结构。当向显示缓存区中写入数据时,就会显示相应的图像。DirectDraw的作用是创建,其实就是取得缓存区的地址,并且还能创建一个虚拟的缓存区内存。例如,A区域内存可以在主内存中创建一块叫offscreen的缓存区。

如果显示卡的内存比较大,如图3.6所示,有一块区域是映像到屏幕上的可见区域,还有的显存区域是屏幕上看不见的,这个区域被称为offscreen。也就是说,A区域为主显存,B区域也可以称为次显存。B区域实际上是被隐藏在后面的,就像DOS的游戏一样,先在次显存绘制好图形,当需要显示时,马上就可以切换过来。DirectDraw中有一个这种操作函数,这个命令如果能切换,就直接切换,如果不能直接地切换,就直接通过显示卡,从次缓存复制到主缓存,这种在显卡内的复制要比软件的memcpy命令快很多。

把两个缓存区域结合起来用就可以做出高速的动画。例如,游戏可以先在次显存上绘制好下一帧画,一切换就能立刻显示出来。这样,画面的速度就很快了。当向A地址写入一个数据时,对应的屏幕上就会出现一个点。

如果需要快速地显示图像,就不能用GDI,而应直接使用DirectDraw。它的缺点就是你必须对显示卡有充分的了解。显示卡可以分为很多种模式,

当用GDI显示一个图像时,就不用管显示卡是什么模式,只要设置好颜色,发送一个绘制命令即可。如果一个图是15位色,当把图形数据直接复制到对应的显存区域时,此时图形就被显示出来了。如果用GDI来显示图形时,它会将相应的色彩进行转换,把它转换成显示所支持的,这个过程需要用一点时间。

DirectDraw只是提供了一种方法,直接地向显存写入数据。在写数据进入显存比较慢时,可能会出现裂缝的图像显示。这是因为当上帧已显示完成了,此时次显存向主显存复制数据。

即是说 DIrectDraw能将显存的结构以内存的形式表现出来,让你去填充,就直接是写到显存了,而GDI则要向显存中拷贝数据,而且有时还要转换成显卡可能支持的模式,要花多点时间。

以前2D游戏区别于桌面应用主要在于有大量的位图复制操作,因为游戏里的内容都是事先生成好的位图,而桌面应用的内容往往是现画的。

GDI的硬件加速主要在画线、画圆、写字这些操作上,而画位图的时候,GDI的重大缺陷就是位图必须保存在内存里。虽然GDI画位图也是显卡加速的,但是位图数据必须通过速度相对来说很慢的前端总线传到显卡上。

而DDraw最核心的功能就是可以把位图直接保存在显存中,画位图的时候直接在显存中复制,通过带宽非常大的显卡内部总线。

比如你画一棵树,GDI每画一次就要从内存到显卡复制一次。而用DDraw之需要复制一次,以后都是在显存内操作了所以快。

但是于此同时DDraw舍弃了GDI的画线、画圆、写字乃至缩放位图等等的功能,所以渐渐被可以实现那些操作的D3D取代了。

当把一个24位的图像用DirectDraw直接向显存中写入时是不正常的,但GDI就会没问题。

要想在16位模式中显示24位的图形,就需要通过程序进行转化。下面是转化的程序。

//24 位 R G B (8 8 8) 16位 R G B(6 5 6)

void Convert24To16 (LPBYTE lpInDate,LPBYTE lpOutDate,

const int nSize)

{

int i ;

int nData;

BYTE R,G,B;

for (i = 0; i < nSize; i++){

nData = *((int *)lpInDate);

R = nData >> 3;

G = nData >> 10;

B = nData >> 19;

nData = B|(G<<5)|(B<<11);

*((int *)lpOutDate) = nData;

}

}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值