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

首先引自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. 限制SSH访问源,禁止4A之外的地址跳转访问

    [fuel节点] 在/etc/hosts.allow文件中添加: sshd:10.129.0.1:allow sshd:10.129.0.2:allow sshd:10.129.0.3:allow s ...

  2. 应注意的Flex&Bison潜规则

    1.Flex的二义性模式 语法分析器匹配输入时匹配尽可能多的字符串 如果两个模式都可以匹配的话,匹配在程序中更早出的模式. 针对这一点的理解,在语法分析文件当中,token的识别,应从特殊到一般的过程 ...

  3. Ubuntu 设定壁纸自动切换的shell脚本

    升级到Ubuntu14.04后,感觉bug的确比12.04少多了.顶部任务栏支持半透明效果,所以整个桌面也看上去漂亮了很多.这样的桌面也是值得瞎捣鼓一下的,想到换壁纸,但是没找到设定动态更换壁纸的选项 ...

  4. Spring MVC Controller中GET方式传过来的中文参数会乱码的问题

    Spring MVC controller 这样写法通常意味着访问该请求,GET和POST请求都行,可是经常会遇到,如果碰到参数是中文的,post请求可以,get请求过来就是乱码.如果强行对参数进行了 ...

  5. java将多个连续的空格转化成一个空格

    java将多个连续的空格转化成一个空格: System.out.println("a a".replaceAll(" + ", " ")); ...

  6. python(四)数据持久化操作 文件存储

    1.写入 导入pickle包 然后组织一个列表my_list,保存为pkl格式,可以是任意格式 在磁盘下回出现一个保存的文件 2.读取

  7. python staticmethod classmethod

    http://www.cnblogs.com/chenzehe/archive/2010/09/01/1814639.html classmethod:类方法staticmethod:静态方法 在py ...

  8. Demo学习: CustomException

    CustomException 捕获程序发生的异常. 1. 抛出各种异常 procedure TMainForm.UniButton1Click(Sender: TObject); begin PBy ...

  9. spot 5、ALOS监督分类波段组成

    spot 5监督分类RGB:412 ALOS分类波段RGB:432

  10. 论Oracle字符集“转码”过程

    本文将通过实验来演示一下Oracle字符集“转码”的确认过程. 1.实验环境说明 客户端是Windows XP操作系统的SQL*Plus程序,客户端字符集是936(对应Oracle的ZHS16GBK字 ...