D3DSWAPEFFECT 枚举

定义交换效果。

语法

typedef enum D3DSWAPEFFECT { 
  D3DSWAPEFFECT_DISCARD      = 1,
  D3DSWAPEFFECT_FLIP         = 2,
  D3DSWAPEFFECT_COPY         = 3,
  D3DSWAPEFFECT_OVERLAY      = 4,
  D3DSWAPEFFECT_FLIPEX       = 5,
  D3DSWAPEFFECT_FORCE_DWORD  = 0xFFFFFFFF
} D3DSWAPEFFECT, *LPD3DSWAPEFFECT;

常量

D3DSWAPEFFECT_DISCARD

当交换链创建具有D3DSWAPEFFECT_FLIP或D3DSWAPEFFECT_COPY的交换效果时,运行时将保证 IDirect3DDevice9::P resent 操作不会影响任何后台缓冲区的内容。 遗憾的是,满足此保证可能涉及大量视频内存或处理开销,尤其是在为窗口交换链实现翻转语义或为全屏交换链实现复制语义时。 应用程序可以使用D3DSWAPEFFECT_DISCARD交换效果来避免这些开销,并使显示驱动程序能够为交换链选择最有效的表示技术。 这也是在为 D3DPRESENT_PARAMETERS 的 MultiSampleType 成员指定除 D3DMULTISAMPLE_NONE 以外的值时可以使用的唯一交换效果。

与使用 D3DSWAPEFFECT_FLIP 的交换链一样,使用 D3DSWAPEFFECT_DISCARD 的交换链可能包含多个后台缓冲区,其中任何一个都可以使用 IDirect3DDevice9::GetBackBufferIDirect3DSwapChain9::GetBackBuffer 进行访问。 交换链最好设想为队列,其中 0 始终为由下一个 Present 操作显示的后台缓冲区编制索引,并在显示缓冲区时丢弃这些缓冲区。

使用此交换效果的应用程序不能对已丢弃的后台缓冲区的内容做出任何假设,因此应在调用显示该缓冲区的 Present 操作之前更新整个后台缓冲区。 尽管未强制执行此操作,但运行时的调试版本将使用随机数据覆盖已丢弃的后台缓冲区的内容,使开发人员能够验证其应用程序是否正在正确更新整个后台缓冲区图面。

D3DSWAPEFFECT_FLIP

交换链可能包含多个后台缓冲区,最好设想为包含前缓冲区的循环队列。 在此队列中,后台缓冲区始终按顺序从 0 编号到 (n - 1) ,其中 n 是后台缓冲区的数量,因此 0 表示最近呈现最少的缓冲区。 调用 Present 时,队列将“旋转”,使前缓冲区成为后台缓冲区 (n - 1) ,而后台缓冲区 0 成为新的前缓冲区。

D3DSWAPEFFECT_COPY

只能为包含单个后台缓冲区的交换链指定此交换效果。 无论交换链是窗口化还是全屏,运行时都将保证基于副本的 Present 操作所暗示的语义,即操作使后台缓冲区的内容保持不变,而不是像基于翻转的 Present 操作那样将其替换为前缓冲区的内容。

对于全屏交换链,运行时使用翻转操作和复制操作的组合(如有必要,由隐藏的后台缓冲区支持)来完成 Present 操作。 相应地,演示文稿与显示适配器的垂直回溯同步,其速率受所选演示间隔的约束。 使用 D3DPRESENT_INTERVAL_IMMEDIATE 标志指定的交换链是唯一的例外。 (请参阅 D3DPRESENT_PARAMETERS structure 的 PresentationIntervals 成员的说明。) 在这种情况下,Present 操作会将后台缓冲区内容直接复制到前缓冲区,而无需等待垂直回溯。

D3DSWAPEFFECT_OVERLAY

使用可在主图面上覆盖的专用视频内存区域。 显示覆盖时不执行任何复制。 覆盖操作在硬件中执行,无需修改主图面中的数据。

Direct3D 9 和 Direct3D 9Ex 之间的差异:

  • D3DSWAPEFFECT_OVERLAY仅适用于在 Windows 7 上运行的 Direct3D9Ex (或更多当前操作系统) 。

D3DSWAPEFFECT_FLIPEX

指定应用程序何时采用翻转模式,在此期间,传递应用程序的框架而不是复制到桌面窗口管理器 (DWM) ,以便在应用程序以窗口模式显示时进行合成。 翻转模式允许应用程序更有效地使用内存带宽,并让应用程序能够利用全屏显示统计信息。 翻转模式不会影响全屏行为。

注意

如果使用 D3DSWAPEFFECT_FLIPEX 创建交换链,则无法替代 D3DPRESENT_PARAMETERS 结构的 hDeviceWindow 成员,当你呈现要显示的新帧时。 也就是说,必须将 NULL 传递给 IDirect3DDevice9Ex::P resentExhDestWindowOverride 参数,以指示运行时对演示文稿使用 D3DPRESENT_PARAMETERShDeviceWindow 成员。

Direct3D 9 和 Direct3D 9Ex 之间的差异:

  • D3DSWAPEFFECT_FLIPEX仅适用于在 Windows 7 上运行的 Direct3D9Ex (或更多当前操作系统) 。

D3DSWAPEFFECT_FORCE_DWORD

强制此枚举编译为大小为 32 位。 如果没有此值,某些编译器将允许此枚举编译为 32 位以外的大小。 不使用此值。

备注

调用 Present 后,后台缓冲区的状态由每个交换效果明确定义,并且 Direct3D 设备是使用全屏交换链创建的,还是窗口交换链对此状态没有影响。 具体而言,无论是开窗还是全屏,D3DSWAPEFFECT_FLIP交换效果都运行相同,Direct3D 运行时通过创建额外的缓冲区来保证这一点。 因此,建议应用程序尽可能使用 D3DSWAPEFFECT_DISCARD 以避免任何此类处罚。 这是因为这种交换效果在内存消耗和性能方面始终是最有效的。

使用 D3DSWAPEFFECT_FLIP 或 D3DSWAPEFFECT_DISCARD 的应用程序不应期望全屏目标 alpha 正常工作。 这意味着,D3DRS_DESTBLEND呈现状态将无法按预期工作,因为从驱动程序的角度来看,具有这些交换效果的全屏交换链没有显式像素格式。 驱动程序推断它们应采用没有 alpha 通道的显示格式。 若要解决此问题,请执行以下步骤:

  • 使用 D3DSWAPEFFECT_COPY。
  • 检查 D3DCAPS9 结构的 Caps3 成员中的 D3DCAPS3_ALPHA_FULLSCREEN_FLIP_OR_DISCARD 标志。 此标志指示在使用D3DSWAPEFFECT_FLIP或D3DSWAPEFFECT_DISCARD时驱动程序是否可以执行 alpha 混合。
  • 使用翻转模式交换效果 (D3DSWAPEFFECT_FLIPEX) 的应用程序应在窗口大小或区域更改后调用 PresentEx ,以确保更新显示内容。

不可见窗口无法接收用户模式事件;此外,不可见的全屏窗口将干扰另一个应用程序的窗口模式窗口的呈现。 因此,每个应用程序都需要确保在全屏模式下显示交换链时,设备窗口可见。

要求

要求
标头
D3D9Types.h

另请参阅

Direct3D 枚举

IDirect3DDevice9::Reset