在DirectX 11中,如何在SwapChain中创建和注册两个缓冲区(DXGI_SWAP_CHAIN_DESC)

时间:2011-09-22 22:36:17

标签: directx buffer directx-11 direct3d11

我是DirectX 11的初学者,在第2章“Beginning DirectX 11”一书后面,有一个使用以下代码创建缓冲区的代码:

DXGI_SWAP_CHAIN_DESC swapChainDesc;
ZeroMemory( &swapChainDesc, sizeof( swapChainDesc ) );
swapChainDesc.BufferCount = 1;
swapChainDesc.BufferDesc.Width = width;
swapChainDesc.BufferDesc.Height = height;
swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
swapChainDesc.BufferDesc.RefreshRate.Numerator = 60;
swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.OutputWindow = hwnd;
swapChainDesc.Windowed = true;
swapChainDesc.SampleDesc.Count = 1;
swapChainDesc.SampleDesc.Quality = 0;

我的问题是在description of swap chain中,显然只有一个缓冲区,因为只有一个BufferDesc(DXGI_MODE_DESC结构)。因此,如果BufferCount设置为2或更多,第二个缓冲区如何注册?它是否正在使用另一个DXGI_SWAP_CHAIN_DESC?请发布一些示例代码。

此外,BufferCount的类型为UNIT,这意味着可以添加两个以上的缓冲区。虽然在双缓冲技术中使用了2个缓冲区,其中一个缓冲区用于绘制,另一个缓冲区用于在场景上显示,并且交换缓冲区。有两种以上缓冲区的用途和优点是什么?

1 个答案:

答案 0 :(得分:3)

拥有更多缓冲区通常意味着提高速度。当缓冲区交换时,您无法对其中任何一个进行任何渲染。你必须等到他们完全交换。这可能需要一些时间,您可以使用渲染另一帧。三重缓冲就是这样。在做一些立体声时,你最多可以使用4(6?)个缓冲区。任何更多都没用。

暂时没有使用DX,但我记得当swapChainDesc.BufferCount设置为某个值时它会自动处理它。另外,我知道这只是第二章,但请使用两个缓冲区。无论他们说什么,你的代码都不会改变,你的速度也会提高。无论如何,最好有两个缓冲区。如果您的唯一缓冲区无法在下一个VBlank上完全渲染,该怎么办?哎呀,缺少图像。