SwapEffect 枚举(定义交换效果)
由于创建设备时要用到这个值,所以在这里总结一下,以免以后再找。
首先引自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 枚举(定义交换效果)的更多相关文章
- UIView的几个枚举定义
UIView是iOS开发最主要的视图,非常多控件都是继承它,掌握当中的几个基本枚举定义,有利益理解视图的载入和參数差别. 一.UIViewAnimationCurve UIView的基本动画变化规律 ...
- [改善Java代码]推荐使用枚举定义常量
枚举和注解都是在Java1.5中引入的,虽然他们是后起之秀,但是功能不容小觑,枚举改变了常量的声明方式,注解耦合了数据和代码. 建议83:推荐使用枚举定义常量 一.分析 常量的声明是每一个项目中不可或 ...
- 拔高你的Java代码质量吧:推荐使用枚举定义常量(转)
提高你的Java代码质量吧:推荐使用枚举定义常量 一.分析 常量的声明是每一个项目中不可或缺的,在Java1.5之前,我们只有两种方式的声明:类常量和接口常量.不过,在1.5版之后有了改进,即新增了一 ...
- python3 枚举定义和使用
定义 在某些情况下,一个类的对象是有限且固定的,比如季节类,它只有 4 个对象:再比如行星类,目前只有 8 个对象.这种实例有限且固定的类,在 Python 中被称为枚举类.程序有两种方式来定义枚举类 ...
- 一个C++宏定义与枚举定义重复的编译错误
C++的开发效率低是众所周知的,原因比如有: 语言复杂度高 编译效率低 工具链不够完整高效(尤其是linux下) 另外一个恐怕是不少编译错误让人摸不着头脑,今天碰到一个,举个例子: #include ...
- oc中的枚举定义
typedef NS_ENUM(类型,枚举名){ 枚举名+值名, 枚举名+值名,}; 该方法定义的枚举,OC会自动把其转换成合适当前版本的枚举.如果枚举值可合并的话 NS_E ...
- 提高Java代码质量:使用枚举定义常量(转)
一.分析 常量的声明是每一个项目中不可或缺的,在Java1.5之前,我们只有两种方式的声明:类常量和接口常量.不过,在1.5版之后有了改进,即新增了一种常量声明方式,枚举常量.代码如下: enum ...
- C++中枚举定义运算符
由于枚举也是用户定义类型,所以是可以定义运算符, 如: enum Day {sun, mon, tue, wen, thu, fri, sat}; Day& operator++(Day&am ...
- iOS中枚举定义的三种方式
最简单的方式 typedef enum{ num1 = 0, num2 = 1, num3 = 2 }num; 同时我们还可以使用NS_ENUM的方式定义枚举 typedef NS_ENUM (NSI ...
随机推荐
- (转)jquery ajax使用及跨域访问解决办法
原文地址:***/UIweb/jquery_ajax_kuayujiejue.html 最近开发中,设计到智能手机项目,给领导做几个demo.主要是用jquery和jqeury mobile. 越来越 ...
- [DevExpress]RepositoryItemComboBox 数据绑定
关键代码: public static void Bind<T>(this RepositoryItemComboBox combox, ICollection source) { /*说 ...
- Js popup position which right under target item
<div style="margin-left:600px;"> <div id="Span1" style="color:#eee ...
- Android使用百度地图API实现GPS步行轨迹
百度地图Android SDK下载:http://developer.baidu.com/map/sdkandev-download.htm 下面是效果: 采样点取得太频繁所以看起来像是一个个点... ...
- Spark小课堂Week5 Scala初探
Spark小课堂Week5 Scala初探 Scala是java威力加强版. 对Java的改进 这里会结合StreamingContext.scala这个代码说明下对Java的改进方面. 方便测试方式 ...
- Spark Streaming揭秘 Day11 Receiver Tracker的具体实现
Spark Streaming揭秘 Day11 Receiver Tracker的具体实现 ReceiverTracker是运行在Driver上Receiver管理程序,今天让我们深入学习一下. 核心 ...
- (转)Qt Model/View 学习笔记 (五)——View 类
Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...
- (转)《深入理解java虚拟机》学习笔记1——Java内存结构
java虚拟机规范规定的java虚拟机内存其实就是java虚拟机运行时数据区,其架构如下: 其中方法区和堆是由所有线程共享的数据区. Java虚拟机栈,本地方法栈和程序计数器是线程隔离的数据区. (1 ...
- ems lite 客户端远程连接mysql server
在本地用ems客户端远程连接虚拟机上的mysql server,弹出客户端没有权限访问mysql server.使用下面方法进行设置:mysql> select host,user,passwo ...
- ASP.NET MVC的约定
ASP.NET MVC 应用程序遵循以下3条约定: 所有的控制器的名称都以Controller结尾,如HomeController, AccountController 这些类默认在Controlle ...