平面

这部分包括DirectDrawSurface对象。有以下主题:

平面的基本概念

这部分包括DirectDrawSurface对象的一些基本概念。有以下主题:

什么是平面?

  一个平面或DirectDrawSurface对象,表现为显存中的一个线性区域。 虽然平面可以用系统内存创建,但一个平面通常驻留在显示卡的显存中。 除非在创建DirectDrawSurface对象时特别指出,否则DirectDraw对象就会将 DirectDrawSurface对象放入性能最佳的地方。DirectDrawSurface对象能利用显示卡的特殊处理能力, 不仅仅能更快得处理任务,而且能使一些任务与系统CPU平行处理。使用IDirectDraw4::CreateSurface宏, 你可以创建一个单独的平面,合成交换链(Surface-Flipping Chains),或三度空间平面。 CreateSurface宏创建所需的平面或交换链并在对象使用它的功能时返回一个主平面的 IDirectDrawSurface4界面的指针。

  IDirectDrawSurface4界面能使你通过Blit宏间接得访问内存,例如 IDirectDrawSurface4::BltFast。平面对象可以提供给显示器一个设备文本使你可以使用GDI函数。 另外,你可以使用IDirectDrawSurface4宏来直接操作显存。例如:你可以使用 IDirectDrawSurface4::Lock宏来锁定并返回那个平面的操作地址。显存的地址可能指向可见帧缓冲内存 (主平面)或不可见的缓冲(屏下Off-Screen或重叠平面Overlay Surfaces)。不可见缓冲通常驻留在显存, 在硬件限制时或DirectDraw使用软件模拟时也可以在系统内存中创建。还有, IDirectDrawSurface4界面添加了一些其他的宏使你可以使用设置或恢复调色板, 或工作于特殊类型的平面,如交换链及重叠层。

  通过以下图示,你可以发现所有DirectDraw对象的平面都与调色板有关。 尽管每个平面对象可以指定一个调色板,在主平面的像素格式不是为8-bits深度(256色) 或更少时调色板便不需要。

DirectDraw 的组成(4572bytes)

平面界面

  DirectDrawSurface对象通过IDirectDrawSurface,IDirectDrawSurface2, IDirectDrawSurface3及IDirectDrawSurface4界面来使用它们的功能。 每个新版本的界面都提供一些老版本所不提供的新的工具,及新宏可用的新选项。

  当你调用IDirectDraw4::CreateSurface宏(或其他IDirectDraw4宏创建)一个平面时, 你会收到平面的IDirectDrawSurface4界面的指针。这个特性有别于老版本的DirectX。 在引入IDirectDraw4界面之前,CreateSurface宏提供一个平面的IDirectDrawSurface界面的指针。 如果你使用一个不同的重复的界面,你就要对其进行查询。在使用IDirectDraw4时,这就不需要了。 如果你喜欢你也可不必为一个以前的重复的界面去查询一个平面。

宽度与跨度

  尽管宽度(Width)与跨度(Pitch)被术语被临时提及,但它们有重要(完全不同)的意义。 所以你需要了解每个的含义,DirectDraw是如何解释它们的值。

  DirectDraw使用DDSURFACEDESC2结构来携带描述一个平面。在其中, 这个结构定义并包含一个平面的尺度信息,如这些尺度是如何在内存中表现的。 结构使用dwHeight及dwWidth成员来描述平面的逻辑尺度。所有这些成员都一像素为标准。 所以,dwHeight及dwWidth的值在一个640x480的平面中不管其是8-bit调色板类型的平面还是 24-bit RGB平面都一样。

  DDSURFACEDESC2结构也包含一个平面如何在内存中表现的lPitch成员。 lPitch成员的值表现平面的内存占用长度(也叫做跨度Stride)。Pitch是一个长度, 以字节Bytes表现,在两个内存地址中表现为一个位图的行的开始到下一个位图的行的开始。 由于Pitch占用长度是基于字节的不同于像素,一个640x480x8的平面会有一个截然不同的占用长度值, 如果其有相同的尺度而像素格式不同。另外,占用长度值有时也反映出DirectDraw有保留缓冲区(Cache), 因此,简单得认为占用长度就是每个像素字节的长度是不可靠的。相反的, 你可以在下图发现宽度(Width)与占用长度(Pitch)的不同:

宽度和跨度(3397bytes)

  在这个图形中,前景缓冲(Front Buffer)及屏后缓冲(Back Buffer) 都是640x480x8,并且缓冲区都是384x480x8。

  在你直接操作显存时占用长度值很有用。例如: 在调用IDirectDrawSurface4::Lock宏以后,DDSURFACEDESC2结构的lpSurface 成员包含平面锁定的左上方像素的地址,而lPitch成员就是平面的占用长度。 你通过像素字节来增加或减少平面的指针来访问像素, 你可以通过增加或减少占用长度值来上下移动当前平面指针。

  当直接访问平面时,注意要一直保证在平面尺度分配的内存中操作, 远离任何保留的缓冲区。另外,当你只锁定平面的一部分, 注意要一直保证在锁定时指定矩形内操作。否则会产生不可预知结果。 当直接显示平面内存时,要一直使用Lock锁定宏(或IDirectDrawSurface4::GetDC宏) 返回的占用长度值。不要认为一个占用长度是基于显示模式。 如果你的程序可以在一些显示适配器工作而在另一些上却看上去很混乱,这可能就是你的问题了。

  详见直接操作平面内存。

色键

  DirectDraw支持使用源色及目标色键来移动Blits及层叠平面。 色键可以使你在另一平面上显示图片时使选定的前景像素显示或选定的背景像素来覆盖。 你可以在调用IDirectDrawSurface4::SetColorKey宏时为源色键或目标色键提供一个单一的色键或一个色彩范围。

  关于色键,详见以下主题:

像素格式

  像素格式指平面内存中每个像素的数据如何阐述。DirectDraw 使用DDPIXELFORMAT结构来描述不同的像素格式。DDPIXELFORMAT包含成员描述以下像素格式特性:


上篇|返回|下篇

Lucker 1999.3.15
E-Mail: fred_cai@kali.com.cn

为方便大家得到新的译文,我请了一个朋友专门为我完成这件事。如果需要得话请来信到:

UPDATA@Kali.com.cn
信中请写明"需要获得新的译文"及邮件信箱大小,以后你就可以在新的文章翻译好后直接在电子邮件中收到。 发信后您会获得回复的确认信,如果一天内未收到回复的确认信请再次发信,直到收到回复的确认信。 (请不要把信送到Fred_Cai@Kali.Com.cn,这个信箱是用来收取意见及建议以及错误的)

云风工作室 制作