DirectX12 - Swap Chain(交换链)

这里是SunshineBooming,GPU公司一枚小小的Driver工程师,主要工作是写DirectX12 Driver,我会持续更新这个DX12 Spec系列,可能比较冷门,但是都是干货和工作中的心得体会,有任何GPU相关的问题都可以在评论区互动,知无不言:

DirectX12 Spec 总目录

1. Swap Chain

1.1 什么是Swap Chain?

  • 我们都知道,DirectX12驱动的功能,仅仅是读取图形Resource数据,提交到Pipeline中各个Shader中,然后渲染出一帧帧的图像数据。最终的显示过程,还是要把帧数据给到Windows系统,交给DirectX10驱动来显示。
  • 那么DirectX12把数据提交到什么地方呢?
    这就是本文的主题:Swap Chain。在DX12 APP初始化的时候,必须要从DXGI库(一套统一的图形交互接口,由DirectX Runtime提供)调用CreateSwapChain()接口,创建一个或者多个Resource资源,并把这个资源通过RTV(Render Target View)的方式告诉DirectX12驱动:你渲染好的图像数据,全部按照一定的Format填充到我给你的Swap Chain Resource中,剩下的交给我显示。
  • 从以上还能了解到一点,就是DirectX12驱动开发这边,必须要等DirectX10驱动Ready之后,才能实际开发。因为DirectX10驱动起来之后,Windows系统才能正常启动,DirectX12数据才能正常显示,所以也比较尴尬。

1.2 为什么叫Swap Chain?

  • 我们知道GPU的渲染效率是很高的,相比之下,可能系统显示的速度跟不上GPU渲染的速度,为了把GPU的效率发挥到极致,我们可以这样做:
  • DX12 APP初始化的时候,调用CreateSwapChain()创建2个RTV资源,2个RTV Resource大小格式全部一样,称之为Resource A&B。
  • 在任意一个显示的时刻,GPU渲染好了Resource A,APP通过CPU&GPU之间的Fence机制(参考另一篇文章)得知Resouce A就绪,就把Resource A提交给系统显示,同时把Resource B提交给GPU渲染。这里Resource A称之为Front Buffer,Resource B称之为Back Buffer
  • 在渲染下一帧时,APP将Resource A&B交换角色,等GPU将Resource B渲染结束后,APP把Resource B提交给系统显示,同时把Resource A交给GPU渲染。
    SwapChain
  • 这里提交给系统显示时,给的都是指针而没有Resource Copy之类的动作,所以效率很高。
    当然,如果GPU速度更快的话,我们也可以设置Triple Buffer,原理也是类似的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值