由于创建设备时要用到这个值,所以在这里总结一下,以免以后再找。

首先引自msdn:

Copy 只能为构成单个后台缓冲区的交换链指定此交换效果。

无论交换链是有窗口的还是全屏的,运行库都保证 Device 的基于复制的 Present 操作所暗示的语义;具体来说,该操作使后台缓冲区的内容保持不变,而不是像基于翻转的 Present操作那样用前台缓冲区的内容来取代后台缓冲区的内容。

对于有窗口交换链,Present 操作使后台缓冲区内容被直接复制到目标窗口的工作区。由于没有尝试使复制与显示适配器的垂直回描周期同步,因此,可能会看到图像撕裂效果。

对于全屏交换链,运行库将组合使用翻转和复制操作(如有必要,隐藏的后台缓冲区支持这种组合)来完成 Present 操作。相应地,呈现与显示适配器的垂直回描同步,并且呈现速率受所选显示间隔的约束。


CopyVSync

此交换效果与复制交换效果大致相同,只是此效果可以使复制与监视器的垂直回描同步,从而消除了图像撕裂现象。

Discard 如果交换链是通过 Flip 或 Copy 的交换效果创建的,则运行库可以保证 Device 的 Present操作不会影响任何后台缓冲区的内容。但是,实现这样的保证会占用大量视频内存或处理系统开销,尤其是在实现有窗口交换链的翻转语义或全屏交换链的复制语义时。

应用程序可以使用 Discard 交换效果来避免这些系统开销,并使显示驱动程序能够为交换链选择最有效的呈现技术。

在为 MultiSampleType 指定 None 以外的值时,Discard 也是可以使用的唯一的交换效果。与使用 Flip 的交换链一样,使用 Discard 的交换链可能包括多个后台缓冲区,可以使用 Device.GetBackBuffer 或 SwapChain.GetBackBuffer 来访问其中的任何一个缓冲区。

交换链本质上是一个队列,其中,0 始终指向将由下一个 Device.Present 操作显示的后台缓冲区,在该操作中,缓冲区在显示后立即被舍弃。使用此交换效果的应用程序应先更新整个后台缓冲区,然后再调用显示该缓冲区的 Device.Present 操作。

运行库的调试版本使用随机数据改写舍弃的后台缓冲区的内容,从而使开发人员能够确认其应用程序对整个后台缓冲区表面的更新正确无误。

对于全屏交换链,创建设备或交换链以后,呈现速率由分配给 Caps.PresentationIntervals的值来确定。除非这个值是“即时”,否则呈现与监视器的垂直同步信号同步。对于有窗口交换链,呈现通过复制操作方式实现,并且始终是即时发生的。

Flip 交换链可能包括多个后台缓冲区,它本质上是一个包括前台缓冲区的循环队列。在此队列中,后台缓冲区始终按从 0 到 (n - 1) 的顺序编号,其中 n 是后台缓冲区的数目,因此,0 表示最近呈现的缓冲区。

调用 Device.Present 时会旋转该队列,这样,前台缓冲区就变成后台缓冲区 (n - 1),而后台缓冲区 0 则变成新的前台缓冲区。

对于全屏交换链,创建设备或交换链以后,呈现速率由分配给 Caps.PresentationIntervals的值来确定。

对于有窗口交换链,翻转通过复制操作方式实现,并且呈现始终是即时发生的。

  调用 Device 的 Present 方法后,通过每个交换效果明确定义了后台缓冲区的状态,无论创建 Microsoft Direct3Db 设备使用的是全屏交换链还是有窗口交换链,对此状态都没有影响。尤其是,无论是有窗口交换链还是全屏交换链,Flip 交换效果都一样,且 Direct3D 运行库通过创建额外的缓冲区来保证这一点。因此,只要有可能避免性能损失,建议应用程序使用 Discard,因为就内存消耗和性能来说,当前的交换效果始终是最有效的。

  全屏目标 Alpha 对使用 Flip 或 Discard 的应用程序不起作用。这意味着,RenderStateManager 的DestinationBlend 不会起到预期的作用,因为从驱动程序的角度来看,具有这些交换效果的全屏交换链没有显式像素格式。驱动程序推断应该采用显示格式,而显示格式没有 Alpha 通道。

其次引自网络:

D3DSWAPEFFECT

1.  D3DSWAPEFFECT_COPY
顾名思义,就是在垂直回扫(vertical retrace)时把back buffer的数据copy到front buffer,确保back buffer的数据没有任何变化。可以通过Present的参数pSourceRect、pDestRect来指定传输的区间,两者大小可以不匹配(stretch blits,会产生aliasing)。一般来说此时swap chain只有一个back buffer。当swap chain是window swap chain时,d3d自动跟踪窗口客户区起始位置,pDestRect里采用client coordinate。
2.  D3DSWAPEFFECT_FLIP
翻转,因为显卡的front buffer只是一个指针,所以我们可以直接交换front buffer和back buffer的指针来达到更新front buffer的目的(对full screen swap chain起作用,如果是window swap chain则会有极大的副作用)。工作方式如下图所示,front buffer跟所有的back buffer连成一个环状链表。
3.  D3DSWAPEFFECT_DISCARD
不难看出,如果对window swap chain采用D3DSWAPEFFECT_FLIP或者对full screen swap chain采用D3DSWAPEFFECT_COPY都会带来性能上的损失。D3DSWAPEFFECT_DISCARD则让驱动(display driver)选择最优效的presentation technique。另外,只有这个参数下才能设置MultiSampleType。

SwapEffect 枚举(定义交换效果)的更多相关文章

  1. UIView的几个枚举定义

    UIView是iOS开发最主要的视图,非常多控件都是继承它,掌握当中的几个基本枚举定义,有利益理解视图的载入和參数差别. 一.UIViewAnimationCurve UIView的基本动画变化规律 ...

  2. [改善Java代码]推荐使用枚举定义常量

    枚举和注解都是在Java1.5中引入的,虽然他们是后起之秀,但是功能不容小觑,枚举改变了常量的声明方式,注解耦合了数据和代码. 建议83:推荐使用枚举定义常量 一.分析 常量的声明是每一个项目中不可或 ...

  3. 拔高你的Java代码质量吧:推荐使用枚举定义常量(转)

    提高你的Java代码质量吧:推荐使用枚举定义常量 一.分析 常量的声明是每一个项目中不可或缺的,在Java1.5之前,我们只有两种方式的声明:类常量和接口常量.不过,在1.5版之后有了改进,即新增了一 ...

  4. python3 枚举定义和使用

    定义 在某些情况下,一个类的对象是有限且固定的,比如季节类,它只有 4 个对象:再比如行星类,目前只有 8 个对象.这种实例有限且固定的类,在 Python 中被称为枚举类.程序有两种方式来定义枚举类 ...

  5. 一个C++宏定义与枚举定义重复的编译错误

    C++的开发效率低是众所周知的,原因比如有: 语言复杂度高 编译效率低 工具链不够完整高效(尤其是linux下) 另外一个恐怕是不少编译错误让人摸不着头脑,今天碰到一个,举个例子: #include ...

  6. oc中的枚举定义

    typedef NS_ENUM(类型,枚举名){        枚举名+值名,       枚举名+值名,}; 该方法定义的枚举,OC会自动把其转换成合适当前版本的枚举.如果枚举值可合并的话 NS_E ...

  7. 提高Java代码质量:使用枚举定义常量(转)

    一.分析  常量的声明是每一个项目中不可或缺的,在Java1.5之前,我们只有两种方式的声明:类常量和接口常量.不过,在1.5版之后有了改进,即新增了一种常量声明方式,枚举常量.代码如下: enum ...

  8. C++中枚举定义运算符

    由于枚举也是用户定义类型,所以是可以定义运算符, 如: enum Day {sun, mon, tue, wen, thu, fri, sat}; Day& operator++(Day&am ...

  9. iOS中枚举定义的三种方式

    最简单的方式 typedef enum{ num1 = 0, num2 = 1, num3 = 2 }num; 同时我们还可以使用NS_ENUM的方式定义枚举 typedef NS_ENUM (NSI ...

随机推荐

  1. 何谓IOC的核心思想

    IOC(Inversion of Control)即控制反转,是在面试或平常交流中经常遇到了词汇:我也曾经仿照Spring,利用JDK的反射和动态代理实现了一个简单的IOC框架,感觉算是知其然也知其所 ...

  2. Linux ed

    ed 编辑器是 Linux 操作系统下最简单的文本编辑器.它是以行为单位对文件进行编辑的编辑器,而不像 MS-DOS 系统下的 edit 那样是以整个屏幕框架为单位对文件进行编辑的.因此,如果你已经习 ...

  3. .NET Web后台动态加载Css、JS 文件,换肤方案

    后台动态加载文件代码: //假设css文件:TestCss.css #region 动态加载css文件 public void AddCss() { HtmlGenericControl _CssFi ...

  4. Hibernate Cascade & Inverse

    Cascade - 修改实体表 Inverse - 修改中间表 http://www.cnblogs.com/amboyna/archive/2008/02/18/1072260.html 1.到底在 ...

  5. jQuery(function($){...})与(function($){...})(jQuery)知识点分享

    写jQuery插件时一些经验分享一下. 一.推荐写法 jQuery(function($){ //coding }); 全写为 jQuery(document).ready(function($){ ...

  6. RHEL 6.5升级GCC 4.9.3

    前提:保证旧版的gcc,g++存在! root用户 1. 下载源码和依赖包源码:新建目录bakwget http://ftp.gnu.org/gnu/gcc/gcc-4.9.3/gcc-4.9.3.t ...

  7. tortoiseGit的SHH秘钥设置

    tortoiseGit如果安装时使用默认的putty方式,因为putty的秘钥格式和SSH的不一样,所以要使用自带的工具重新生成一次秘钥. 具体的方式是:用puttyGen工具来生成公钥和秘钥,公钥( ...

  8. eclipse 安装egit 成功后Team中没有显示

    主要是版本不太对. 在http://wiki.eclipse.org/EGit/FAQ#Where_can_I_find_older_releases_of_EGit.3F 中找到对应的版本,设置就O ...

  9. Mysql数据库备份和还原常用的命令

    Mysql数据库备份和还原常用的命令是进行Mysql数据库备份和还原的关键,没有命令,什么都无从做起,更谈不上什么备份还原,只有给系统这个命令,让它去执行,才能完成Mysql数据库备份和还原的操作,下 ...

  10. iframe 刷新

    iframe刷新父页面 parent.location.reload(); iframe 一个子页面操作过后,刷新指定子页面 parent.frames('ifrmname').location.re ...