Windows Game Note3

1、16位高彩模式:
    Alpha.5.5.5      X.5.5.5    5.6.5
获取像素格式: 要知道任意表面的像素格式,需要调用IDIRECTDRAWSURFACE7::GetPixelFormat()函数
DDPIXELFORMAT结构,dwFlags常用标志:
DDPF_PALETTEINDEXED8:说明表面采用8位调色板模式
DDPF_RGB:说明表面采用RGB模式,其格式可以通过测试dwRGBBitCount值获取。
#define _RGB16BIT555(r, g, b) ((b & 31) + (g & 31) << 5 + (r & 31) << 10) //用于5.5.5
#define _RGB16BIT565(r, g, b) ((b & 31) + (g & 63) << 5 + (r & 31) << 11) //用于5.6.5
2、RGB16位 5.6.5模式,为了往屏幕上写像素,必须:
① 锁定表面
② 建立16位RGB字
③ 写像素
④ 解锁主表面
3、#define _RGB24BIT(r, g, b) ((b) + ((g) << 8 + (r) << 16)
4、在离屏缓冲中绘制图像,然后将其拷贝到显示表面的处理过程被称作双缓冲技术。 如果系统内安装了加速硬件,可以使用一种类似双缓冲的页面切换技术(Page Flipping)。 页面切换技术类似于双缓冲技术, 不过是在你画完了一两帧备用的可见表面之后,你直接操作硬件激活其他表面使其可见。这样做旧免除了内存块拷贝的开销,因为硬件寻址系统直接将视频光栅指向了不同的内存部分。最后的结果是一个即时的页面交换和可见屏幕的更新。
5、 实现双缓冲很容易,你只需要完成的只是额外地分配一块同主DirectDraw表面具有同样尺寸的内存,并在这块内存上画每一帧动画之后拷贝双缓冲内存到主显示表面。
6、离屏表面:有两类离屏表面,第一种叫做后备缓冲(Back Buffer),是指一些用在动画链中的表面,它们具有和主表面相同的尺寸和色深。后备缓冲表面较为独特,因为当你创建主表面时也创建它们。它们都是主表面页面切换链中中的环节。 你可以将它和主表面进行页面切换,这比双缓冲方案下所需做的内存拷贝要快得多。
7、 为了创建一个关联有后备缓冲的主表面,你必须创建DirectDraw所谓的复杂表面(Complex Surface),下面是其创建步骤:
① 首先,要将DDSD_BACKBUFFERCOUNT加到dwFlags标志字段,向DirectDraw表明DDSURFACEDESC2结构的dwBackBufferCount字段有效,其中含有后备缓冲的数目
② 其次,将控制标志DDSCAPS_COMPLEX和DDSCAPS_FLIP加到DDSURFACEDESC2结构的特性描述字段ddsCaps.dwCaps
③ 最后,像通常一样创建主表面。从它调用IDIRECTDRAWSURFACE7::GetAttachedSurface以得到后备缓冲。
  要对后备缓冲进行存取,你可以同对主表面一样将其加锁和解锁。
8、 页面切换: 当你已经创建了具有一个主表面和一个后备缓冲表面的复杂表面,就可以进行页面切换了。需要以下几步:
① 清除后备缓冲
② 将场景渲染到后备缓冲
③ 用后备缓冲表面切换掉主表面
④ 锁定在某个帧速率
⑤ 重复第一步
    事实上,指向VRAM的指针是由硬件切换的,从DirectDraw和编程人员的观点来看,后备缓冲表面总是离屏的,而主表面总是可见的。 所以你总是在后备缓冲中进行绘制,并且每帧与主表面作切换。
    可是使用函数IDIRECTDRAWSURFACE7::Flip(),在交换链中用下一个关联的表面切换主表面。 你必须调用主表面对象成员函数Flip(),而不是后备缓冲对象的。因为主表面是后备缓冲表面的“父”,后备缓冲是“父”交换链中的一环。例:lpddsprimary->Flip(NULL, DDFLIP_WAIT);
    在切换页之前,主表面或者后备缓冲表面都必须被解锁,所以在调用Flip()之前要确保它被解锁。
9、当你创建一个后备缓冲时,DirectDraw可能在系统内存中创建它,而不是在VRAM中(如果没有剩余的显存可用)。那时,你无需做任何事情,DirectDraw将会用双缓冲 仿真 页面切换,而在你调用Flip()的时候将后备缓冲表面拷贝到主表面。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值