В DirectX 11, как создать и зарегистрировать два буфера в SwapChain (DXGI_SWAP_CHAIN_DESC) - PullRequest
1 голос
/ 23 сентября 2011

Я новичок в DirectX 11, и после книги Beginning DirectX 11 в главе 2 есть код для создания буфера, используя следующий код:

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;

Мой вопрос заключается в описание цепочки подкачки , очевидно, есть место только для одного буфера, поскольку существует только один BufferDesc (структура DXGI_MODE_DESC).Итак, если для BufferCount установлено значение 2 или более, как регистрируется второй буфер?Используется ли другой DXGI_SWAP_CHAIN_DESC?Пожалуйста, напишите пример кода.

Также BufferCount имеет тип UNIT, что означает, что можно добавить более двух буферов.В то время как 2 буфера используются в технике двойной буферизации, в которой один буфер используется для рисования, а другой буфер используется для отображения на сцене, и буферы меняются местами.Какая польза, преимущества более двух буферов?

1 Ответ

3 голосов
/ 07 октября 2011

Наличие большего количества буферов обычно означает улучшение скорости. Когда буферы меняются местами, вы не можете выполнять рендеринг ни на одном из них. Вы должны ждать, пока они полностью не поменялись местами. Это может занять некоторое время, которое вы могли бы использовать для рендеринга другого кадра. Тройная буферизация именно это. Вы можете использовать до 4 (6?) Буферов при выполнении стереоскопических операций. Больше было бы бесполезно.

Некоторое время я не занимался DX, но я помню, что он обрабатывал его автоматически, когда для swapChainDesc.BufferCount установлено значение. Кроме того, я знаю, что это только вторая глава, но, пожалуйста, используйте два буфера. Независимо от того, что они говорят, ваш код не изменится, и у вас будет увеличение скорости. И в любом случае, лучше иметь два буфера. Что если ваш единственный буфер не может быть полностью обработан на следующем VBlank? К сожалению, пропущенное изображение.

...