织梦CMS - 轻松建站从此开始!

罗索

GDI和DirectDraw的关系

jackyhwei 发布于 2009-12-29 19:43 点击:次 
屏幕上的显示在内存中是以下这样的结构。当向显示缓存区中写入数据时,就会显示相应的图像。DirectDraw的作用是创建,其实就是取得缓存区的地址,并且还能创建一个虚拟的缓存区内存。
TAG:

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

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

  

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

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

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

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

当把一个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;

        }

}
 

(jacky)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/200912/8195.html]
本文出处:网络博客 作者:jacky
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容