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 ...
随机推荐
- VS 2013的初配置
首先,安装vs2013,安装过程比较简单,也已有教程,在此不赘述.只想说一下,vs2013需要占C盘比较大的空间:所有功能都安装,且装在C盘的话,约需要9G左右,即使安装在其他盘,也需要占C盘6G左右 ...
- 使用百度zrender, demo抛砖引玉.
http://www.just.org.cn/zrender/index.html https://github.com/ecomfe/zrender 目录结构: |-project |-dem ...
- JS如何获取iframe内html的body值
default页面: <html> <head> <script type="text/javascript"> window.onload=f ...
- WinForm条码打印
在这篇博客中,我曾经介绍了如何实现条形码的生成(生成jpg格式的图片),这篇博客借用上面生成的条码,能够实现条形码的打印功能. 出于批量打印操作的方便以及操作体验考虑,我选择了WinForm.功能很简 ...
- 禁止指定目录执行php文件
我们设置网站权限的时候,有些目录不得不设置让http服务器有写入权限,这样安全隐患就来了.比如discuz x2的 data目录,这个必须要有写入限,论坛才能正常运行,但有的黑客可能就会利用这个目录上 ...
- ES6学习笔记(三)
ES6加强了对Unicode的支持,并且扩展了字符串对象. 1.字符的Unicode表示法 JavaScript允许采用\uxxxx形式表示一个字符,其中"xxxx"表示字符的码点 ...
- install ruby and ruby gem
sudo apt-get install ruby #find an folder and: git clone https://github.com/rubygems/rubygems.git cd ...
- Kinetic使用注意点--container
<virtual> new Container(config) 参数: config:包含所有配置项的对象. { x: "横坐标", y: "纵坐标" ...
- windows2003 64位 iis6.0 运行32位web应用程序
适用于已安装.NET4.0的windows 2003 64位机器. 系统要求: windows 2003 sp1 步骤: 1. 打开命令行,转到目录: %systemdrive%\Inetpub\Ad ...
- iOS中touches事件,addtarget ...action和GestureRecognizer详解
刚学完uiview,uicontrol类,许多人知道 touchesBegain,touchesMoved,touchesEnd,GestureRecognizer的用途,但仔细考虑这些事件之间的关系 ...