为了避免动画中的闪烁,最好将整个动画帧绘制到称为后台缓冲区的屏幕外纹理(off-screen texture)中。一旦整个场景被绘制到给定动画帧的后缓冲区,它就作为一个完整的帧呈现给屏幕;以这种方式,观看者不会在绘制帧时观看到 - 观看者只能看到完整的帧。为实现这一点,硬件维护两个纹理缓冲区(texture buffers),一个称为前缓冲区(front buffer),另一个称为后缓冲区(back buffer)。前缓冲区存储当前正在监视器上显示的图像数据,而下一帧动画正被绘制到后缓冲区。在将帧绘制到后台缓冲区后,后台缓冲区和前台缓冲区的角色对调:后台缓冲区成为前台缓冲区,前台缓冲区成为下一帧动画的后台缓冲区。交换后台和前台缓冲区的角色称为呈现(presenting)。呈现是一种高效的操作,因为只需要交换指向当前前缓冲区的指针和指向当前后缓冲区的指针。图4.1说明了该过程。

图4.1。 对于第n桢,当前是缓冲区A正在被显示,下一帧将被渲染到缓冲区B,缓冲区B用作当前后台缓冲区。 帧绘制完成后,交换指针,缓冲区B成为前缓冲区,缓冲区A成为新的后台缓冲区。 然后我们将下一帧n + 1渲染到BufferA。 帧完成后,交换指针,缓冲区A成为前缓冲区,缓冲区B再次成为后台缓冲区。

前后缓冲区形成交换链(a swap chain)。 在Direct3D中,交换链由IDXGISwapChain接口表示。 此接口存储前后缓冲区纹理(the front and back buffer textures),并提供调整缓冲区大小(IDXGISwapChain :: ResizeBuffers)和呈现(IDXGISwapChain :: Present)的方法。
使用两个缓冲区(前缓冲区和后缓冲区)称为双重缓冲。 可以使用两个以上的缓冲区; 使用三个缓冲区称为三重缓冲。 但是,两个缓冲区通常就足够了。

  

旁注:即使后缓冲区是纹理(a texture)(因此元素应该称为纹素),但我们经常将元素称为像素,因为在后缓冲区的情况下,它存储颜色信息(in the case of the back buffer, it stores color information这句不懂)。 有时人们会将纹理元素称为像素,即使它不存储颜色信息(例如,“法线贴图的像素”)。

【D3D12学习手记】The Swap Chain and Page Flipping的更多相关文章

  1. 【D3D12学习手记】The Command Queue and Command Lists

    GPU有一个命令队列,CPU通过Direct3D API将命令提交到队列里来使用命令列表(command lists),如下图.当一套命令(a set of commands)已经被提交到命令队列,他 ...

  2. 【D3D12学习手记】4.3.8 Create the Depth/Stencil Buffer and View

    我们现在需要创建深度/模板缓冲区. 如§4.1.5所述,深度缓冲区只是一个2D纹理,用于存储最近的可见对象的深度信息(如果使用模板(stencil),则也会存储模板信息). 纹理是一种GPU资源,因此 ...

  3. 【D3D12学习手记】4.1.6 Resources and Descriptors

    在渲染过程中,GPU将写资源(resources)(例如,后缓冲区,深度/模板缓冲区),读资源(例如,描述表面外观的纹理,存储场景中几何体3D位置的缓冲区).在我们发出绘图命令之前,我们需要将资源绑定 ...

  4. 【D3D12学习手记】CPU/GPU Synchronization

    由于有两个并行运行的处理器(CPU和GPU),会出现许多同步问题.假设我们有一些资源R存储了我们希望绘制的某些几何体的位置. 此外,假设CPU更新R的数据以存储位置p1,然后将引用R的绘图命令C添加到 ...

  5. Linux.NET学习手记(7)

    前一篇中,我们简单的讲述了下如何在Linux.NET中部署第一个ASP.NET MVC 5.0的程序.而目前微软已经提出OWIN并致力于发展VNext,接下来系列中,我们将会向OWIN方向转战. 早在 ...

  6. Linux.NET学习手记(8)

    上一回合中,我们讲解了Linux.NET面对OWIN需要做出的准备,以及介绍了如何将两个支持OWIN协议的框架:SignalR以及NancyFX以OwinHost的方式部署到Linux.NET当中.这 ...

  7. 关于《Linux.NET学习手记(8)》的补充说明

    早前的一两天<Linux.NET学习手记(8)>发布了,这一篇主要是讲述OWIN框架与OwinHost之间如何根据OWIN协议进行通信构成一套完整的系统.文中我们还直接学习如何直接操作OW ...

  8. EF框架学习手记

    转载: [ASP.NET MVC]: - EF框架学习手记 1.EF(Entity Framework)实体框架EF是ADO.NET中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架 ...

  9. ExtJS MVC 学习手记3

    在演示应用中,我们已经创建好了viewport,并为之添加了一个菜单树.但也仅仅是这样,点击树或应用的其他地方获得不到任何响应.这个演示应用还是一个死的应用. 接下来,我们让这个应用活起来. 首先,给 ...

随机推荐

  1. Oracle修改表,提示“资源正忙,要求指定NOWAIT”

    今天往一个表里面多增加了两个字段,修改完毕,保存的时候,提示如下内容:“资源正忙,要求指定nowait”.重试好几遍,都没有解决,于是搜索了一下,找到了解决方法,如下: 首先执行下面一段代码,得到锁定 ...

  2. python 文件操作的相对路径和绝对路径(windows)

    1.相对路径 windows  '.\'表示当前路径 with open(r'.\db\123.txt','w',encoding='utf-8') as f: f.write('abc') 2.绝对 ...

  3. 201871010126 王亚涛 《面向对象程序设计 (Java)》第十七周学习总结

    内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/12 ...

  4. PyQt打包可执行文件

    1.安装pyinstaller pip install pyinstaller 2.pyinstaller打包 pyinstaller -F -w xxxx.py -F:生成可执行文件 -w:不显示命 ...

  5. Listview操作

    设置 listView1.VirtualMode = true;   listView1.RetrieveVirtualItem += ListView1_RetrieveVirtualItem; p ...

  6. B/S文件夹上传下载组件

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 先说下要求: PC端全平台支持,要求支持Windows,Mac,Linux 支持所 ...

  7. flask框架(六): 实现支持正则的路由

    一:默认路由 @app.route('/user/<username>') @app.route('/post/<int:post_id>') @app.route('/pos ...

  8. 顺序表应用6:有序顺序表查询(SDUT 3330)

    Problem Description 顺序表内按照由小到大的次序存放着n个互不相同的整数,任意输入一个整数,判断该整数在顺序表中是否存在.如果在顺序表中存在该整数,输出其在表中的序号:否则输出&qu ...

  9. Java集合框架之接口Collection源码分析

    本文我们主要学习Java集合框架的根接口Collection,通过本文我们可以进一步了解Collection的属性及提供的方法.在介绍Collection接口之前我们不得不先学习一下Iterable, ...

  10. Jmeter -- 对并发认识的误区

    1. 误区 如下图所示,并发数设置为1000,启动时间设置1s,就是每秒发起1000个请求(错误) 上述的设置,表示在1s内启动1000个线程,之后,jmeter便以最大限度的1000个并发进行压测, ...