交换链,对应的接口是IDirect3DSwapChain9,是整个Directx 3D中最核心的接口。D3d程序至少包含一个swap chain,在调用CreateDevice时自动创建,

其中的D3DPRESENT_PARAMETERS * pPresentationParameters参数设置将要创建的IDirect3DSwapChain9的属性。首先我们看看这个接口提供的函数,我们

可以找到Present函数,
其实不难猜到IDirect3DDevice9::Present函数内部就是调用了默认IDirect3DSwapChain9Present函数。

  进一步讲,IDirect3DDevice9GetBackBufferGetFrontBufferData等函数都调用了IDirect3DSwapChain9的接口所以一般有一个UINT  iSwapChain参数来指示调用哪个

swap chain
,0代表默认CreateDevice时创建的IDirect3DSwapChain9
IDirect3DSwapChain9::GetBackBuffer

Retrieves a back buffer from the swap chain of the device.

IDirect3DSwapChain9::GetDevice
Retrieves the device associated with the swap chain.
IDirect3DSwapChain9::GetDisplayMode
Retrieves the display mode's spatial resolution, color resolution, and refresh frequency.
IDirect3DSwapChain9::GetFrontBufferData
Generates a copy of the swapchain's front buffer and places that copy in a system memory buffer provided by the application.
IDirect3DSwapChain9::GetPresentParameters
Retrieves the presentation parameters associated with a swap chain.
IDirect3DSwapChain9::GetRasterStatus
Returns information describing the raster of the monitor on which the swap chain is presented.
IDirect3DSwapChain9::Present
Presents the contents of the next buffer in the sequence of back buffers owned by the swap chain.

Front buffer

  A graphics adapter holds a pointer to a surface that represents the image being displayed on the monitor, called a front buffer.其中的内容会直接发送给显示器显示,

其大小等于screen size,可以通过下面代码来获取。首先我们必须创建一个Cpu的IDirect3DSurface9,然后通过GetFrontBufferData填充其内容。如果直接绘制到Front buffer上,会使画面不连续

,撕裂(tearing)等等。当显示器(monitor)刷新时,显卡把front buffer的内容发送给显示器。一般的显示器刷新频率在60Hz到100Hz之间,这跟计算机其他部件的工作频率相差甚远。如果程序在显示器

刷新的过程中更新了front buffer,那么显示出来的上半部分画面是旧的,下半部分画面是新的,这就是撕裂(tearing).
 D3DDISPLAYMODE dm;
g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT,&dm );
IDirect3DSurface9* pSurface;
g_pd3dDevice->CreateOffscreenPlainSurface( dm.Width, Height,
D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pSurface, NULL);
g_pd3dDevice->GetFrontBufferData(, pSurface);
D3DXSaveSurfaceToFile(
_T("Desktop.bmp"),D3DXIFF_BMP,pSurface, NULL, NULL );
pSurface->Release();

解决这个问题有两种方案:

1,只在垂直回扫(vertical retrace)时允许更新front buffer,在每一次刷新,显示器从上到下,从左到右的移动光头(light pin),一直到右下角为止。然后光头又移动回
显示器的
左上角(vertical retrace),为下一次刷新做准备。这样可以避免撕裂,但是垂直回扫(vertical retrace)时间往往不足以绘制复杂场景。 2, 后台缓存(back buffering) 。
Back buffering is the process of drawing a scene to an off-screen surface, called a back buffer. Note that any surface
other than the front buffer is called an off-screen surface because it is never directly viewed by the monitor. By using a back buffer, an application
has the freedom to render a scene whenever the system is idle (that is, no windows messages are waiting) without having to consider the monitor's refresh
rate. Back buffering brings in an additional complication of how and when to move the back buffer to the front buffer.解决方法是在垂直回扫(vertical retrace)
时把数据从back buffer移动到front buffer,两种移动方式,直接copy或者Flipping Surfaces,这可以通过D3DPRESENT_PARAMETERS的SwapEffect参数来指定。
												

swap chain- IDirect3DSwapChain9的更多相关文章

  1. 【D3D12学习手记】The Swap Chain and Page Flipping

    为了避免动画中的闪烁,最好将整个动画帧绘制到称为后台缓冲区的屏幕外纹理(off-screen texture)中.一旦整个场景被绘制到给定动画帧的后缓冲区,它就作为一个完整的帧呈现给屏幕;以这种方式, ...

  2. DirectX 总结和DirectX 9.0 学习笔记

    转自:http://www.cnblogs.com/graphics/archive/2009/11/25/1583682.html DirectX 总结 DDS DirectXDraw Surfac ...

  3. DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记

    今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...

  4. DXGI 1.5新特性

    为了支持更具弹性和的输出设定和副本机制,DXGI1.5添加了下面这些功能: 高动态范围(HDR)和宽色域(WCG) 可变刷新率显示 复制输出 奉献和再生资源 高动态范围(HDR)和宽色域(WCG) H ...

  5. Windows8.1画热度图 - 坑

    想要的效果 如上是silverlight版本.原理是设定一个调色板,为256的渐变色(存在一个png文件中,宽度为256,高度为1),然后针对要处理的距离矩阵图形,取图片中每个像素的Alpha值作为索 ...

  6. Direct3D11学习:(二)基本绘图概念和基本类型

    转载请注明出处:http://www.cnblogs.com/Ray1024   一.概述 在正式开始学习D3D11之前,我们必需首先学习必要的基础知识. 在这篇文章中,我们将介绍一下Direct3D ...

  7. D3D的内存类型

    一.对D3D中AGP显存.内存.显存三种内存的解释 三种内存AGP内存(非本地显存),显存(本地内存),系统内存,其中我们都知道系统内存就是咱那内存条,那这AGP内存是个啥玩意啊?其实是因为在以前显卡 ...

  8. [百度空间] [转]关于Direct3D多窗口编程的一篇翻译

    Introduction In DirectX 8, support for rendering to multiple windows is provided through the creatio ...

  9. 最简单的视音频播放示例3:Direct3D播放YUV,RGB(通过Surface)

    上一篇文章记录了GDI播放视频的技术.打算接下来写两篇文章记录Direct3D(简称D3D)播放视频的技术.Direct3D应该Windows下最常用的播放视频的技术.实际上视频播放只是Direct3 ...

随机推荐

  1. 方法:Linux 下用JAVA获取CPU、内存、磁盘的系统资源信息

    CPU使用率: InputStream is = null; InputStreamReader isr = null; BufferedReader brStat = null; StringTok ...

  2. stl的实现原理简单讲解,通熟易懂

    总结 需要经常随机访问请用vector 2.list list就是双向链表,元素也是在堆中存放,每个元素都是放在一块内存中,它的内存空间可以是不连续的,通过指针来进行数据的访问,这个特点使得它的随机存 ...

  3. Error LNK2001 无法解析的外部符号 的几种情况及解决办法

    最近遇到的关于VS里编译出现的“无法解析的外部符号”问题,在网上寻求解决办=办法时查到下面的博客内容,作者讲解的挺全面的,作为收藏以备将来查询. 原文http://blog.csdn.net/shen ...

  4. 暑假集训(4)第七弹——— 组合(hdu1850)

    题意概括:你赢得了第一局.魔鬼给出的第二局是,如果有N堆牌,先手的人有几种可能胜利. 问题分析:尼姆游戏,先得到n堆牌的数量异或和,再将异或和与每一个牌组的数量异或,如果结果小于原牌组数量 则可能++ ...

  5. office2013发布博客

    0, 喜欢用world记笔记,并查上一些配图.但是再想重新发到博客上,图片不得不重新上传十分蛋疼. world直接发布博客功能太棒了,直接绑定账号和url就可以发送了,爽YY!!! 1,新建一个博客文 ...

  6. 哆啦A梦连连看游戏源码完整版

    这个源码是哆啦A梦连连看游戏源码完整版,也是安卓教程网android.662p.com分享过来的,哆啦A梦大家一定再熟悉不过了,这次登场的角色你能认出全部吗?赶紧把相同的小图标全部消除吧,一起体验下! ...

  7. ssh 登陆指定 验证文件

    当前用户jim ssh-keygen -t rsa 生成密钥 把pub结尾的公用密钥数据追加到192.168.1.3上的 /home/tom/.ssh/authKeys(文件名可能不一样) ssh - ...

  8. apache 设置禁止访问某些文件或目录

    [apache配置禁止访问]1. 禁止访问某些文件/目录增加Files选项来控制,比如要不允许访问 .inc 扩展名的文件,保护php类库:<Files ~ "\.inc$" ...

  9. jquery + json 操作

    jquery 读取集合对象多是要与json进行解析操作的,以下自己经过多方资料查找,终于有一套自己的方式组合.  1.首先创建web services或一般处理程序,用于显示获取Datatable对象 ...

  10. Web开发常见的漏洞

    SQL注入漏洞 跨站脚本攻击漏洞 登陆后台管理页面 IIS短文件/文件夹漏洞 系统敏感信息泄露