DXGI_SWAP_EFFECT_DISCARD和DXGI_SWAP_EFFECT_SEQUENTIAL有什么区别?

我很难理解这两个DXGI_SWAP_EFFECT枚举值之间的差异。 MSDN文档指出:

DXGI_SWAP_EFFECT_DISCARD

使用此标志指定位块传输(bitblt)模型,并在调用IDXGISwapChain1::Present1之后指定DXGI丢弃后台缓冲区的内容。 此标志对于具有多个后台缓冲区的交换链是有效的,但应用程序只能对缓冲区0进行读写访问。使用此标志可使显示驱动程序为交换链select最有效的演示技术。

DXGI_SWAP_EFFECT_SEQUENTIAL

使用此标志指定bitblt模型,并在调用IDXGISwapChain1::Present1之后指定DXGI保留后台缓冲区的内容。 使用此选项按顺序显示交换链的内容,从第一个缓冲区(缓冲区0)到最后一个缓冲区。 该标志不能用于多重采样。

因此, Sequential用于显示“按顺序”链中的内容,换句话说,按照与您所谓的Present()相同的顺序。 如果是这样,是不是为了Discard ? 显然,旧的照片永远不能显示在更新的照片之前。 那么这个标志能启用什么样的“最有效的表示技术”呢?

如果你的显示器的刷新率是60fps,你的代码能够以90fps渲染,会怎么样? 在这种情况下,两个Present的每一个,队列都将满。 那会发生什么? Present是否会阻塞到下一个vsync,将渲染速率限制在60fps,引入input滞后,还是会丢弃队列中最旧的缓冲区,并允许您尽可能快地使用渲染代码? 这些DXGI_SWAP_EFFECT标志是否对这个问题DXGI_SWAP_EFFECT

谢谢。

这两种技术将总是以正确的顺序渲染帧。 关键的区别在于,一旦有了Present()足够的帧以返回已经渲染的缓冲区,_SEQUENTIAL将保证内容与您呈现的内容相同。 有了_DISCARD,但是,它可能是垃圾。

这涉及D3D中可修改曲面的较大的“丢弃”语义。 举个例子,在一些硬件架构上,渲染是以“块”块完成的,大量的中间色彩数据存储在caching中。 渲染新帧时,如果硬件需要保证增量渲染的正确性(即_SEQUENTIAL),则必须在Present()调用之后将该caching刷新到主内存。 但是,如果使用_DISCARD,则可以省略此刷新,但主存不会使用caching的值进行更新(它们将被丢弃)。 如果你总是在每一帧重新渲染整个场景,这不会是一个问题。