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

首先引自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. 第一个MapReduce程序

    计算文件中每个单词的频数 wordcount 程序调用 wordmap 和 wordreduce 程序. import org.apache.hadoop.conf.Configuration; im ...

  2. Codevs 1158 尼克的任务

    1158 尼克的任务 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮 ...

  3. .Net Core 中的包、元包与框架(Packages, Metapackages and Frameworks)

    包,元包与框架 本文翻译自 Packages, Metapackages and Frameworks. .Net Core 是一种由 NuGet 包组成的平台.一些产品体验受益于代码包的细粒度定义, ...

  4. makefile--编码修改-空格出现错误

    "makefile", line 40: make: 1254-055 Dependency line needs colon or double colon operator. ...

  5. 《QQ欢乐斗地主》山寨版

    使用Cocos2d-x编写,模仿<QQ欢乐斗地主>的界面实现了一个具有简单AI的单机版斗地主游戏. 游戏的详细说明请查看游戏目录下的help.txt文件. 下载地址: http://dow ...

  6. windows phone URI映射

    UriMapping用于在一个较短的URI和你项目中的xaml页的完整路径定义一个映射(别名).通过使用别名URI,开发者可以在不改变导航代码的情况下来改变一个项目的内部结构.该机制还提供了一个简单的 ...

  7. springMVC整合memcached

    非原创,文章转自:http://www.cnblogs.com/xiaoqingxin/p/4132391.html 文章我就不全copy了,摘抄下我关注的部分,想看原文的请移步上面文章链接 appl ...

  8. DTcms列表隔行换色;loop自带行号

    <%loop cdr2 bcategoryList%> <%if(cdr2__loop__id==1)%> <a class="no-bg" href ...

  9. gridview 字段没有绑定由于column visible= false

    由于gridview column visible=false, 后面执行gridview databound()操作 不会将数据绑定到相关的单元格,其实这个时候我们希望绑定数据只是不显示而已. 可以 ...

  10. Class<Object>与Class<?>有何区别呢

    1.? 和 Object 差不多,不过还是有差别.在这种情况下: class<? extends SomeClass> , Object就不能用了 Object是一个具体的类名,而?是一个 ...