D3D10 (DirectX10) проблема производительности полноэкранного режима - PullRequest
2 голосов
/ 17 июня 2009

У меня возникла небольшая проблема при настройке приложения DirectX10 (Win32 / c ++) для полноэкранного режима. Проблема в том, что я хочу, чтобы мое приложение работало в полноэкранном режиме с самого начала. Это можно сделать, взяв функцию DXGISwapChain :: SetFullScreenState. Это работает, но я получаю небольшое уведомление в моем отладчике Visualc ++ 2008, в котором говорится:

"DXGI Предупреждение: IDXGISwapChain ::. Присутствуют: Fullscreen неэффективностью презентационные понесены в связи с применением не используя IDXGISwapChain :: ResizeBuffers соответственно, указав DXGI_MODE_DESC не доступны в IDXGIOutput :: GetDisplayModeList или не используя DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH"

Это означает, что DirectX не будет полностью владеть видеокартой и переворачивает изображения с фронта на задний буфер, а вместо этого копирует их, что намного медленнее.

Теперь у меня действительно включен DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH, и я попытался изменить размеры моих буферов, но я совершенно не представляю, как лучше всего перейти в полноэкранный режим. Я посмотрел на MSDN, но там они в основном предполагают, что вы перейдете в полноэкранный режим, только нажав Alt + Enter, чтобы DXGI не делал всю работу. Если кто-то, пожалуйста, может опубликовать немного кода, который переводит DirectX10 в полноэкранный режим и использует все преимущества «переворачивания», это было бы очень полезно!

Для всех, кто интересуется кодом, используемым для изменения размера:

ReleaseCOM(m_pD3DRenderTargetView);
ReleaseCOM(m_pD3DDepthStencilView);
ReleaseCOM(m_pD3DDepthStencilBuffer);

DXGI_MODE_DESC* mod = new DXGI_MODE_DESC;
mod->Format = DXGI_FORMAT_R8G8B8A8_UNORM;
mod->Height = m_ScreenHeight;
mod->Width = m_ScreenWidth;
mod->RefreshRate.Denominator = 0;
mod->RefreshRate.Numerator = 0;
mod->ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
mod->Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
delete mod; mod = 0;

m_pSwapChain->ResizeTarget(mod);

HR(m_pSwapChain->ResizeBuffers(1, m_ScreenWidth, m_ScreenHeight, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH))
    throw(Exception(GET_BUFFER_FAIL, AT));

//problem area
m_pSwapChain->SetFullscreenState(TRUE, NULL);

ID3D10Texture2D* pBackBuffer;
HR( m_pSwapChain->GetBuffer(0, __uuidof(ID3D10Texture2D), (LPVOID*)&pBackBuffer))
    throw(Exception(GET_BUFFER_FAIL, AT)); //continues as usual

Ответы [ 2 ]

0 голосов
/ 16 июля 2009

Есть несколько предпосылок для включения переворота в DXGI (который является наиболее эффективным полноэкранным режимом презентации):

1) Вы должны перейти в полноэкранное состояние, указав режим, который существует в системе (вы можете сделать это, используя режим из IDXGIOutput :: GetDisplayModeList или найдя его с помощью IDXGIOutput :: FindClosestMatchingMode). Ваш код просто указывает разрешение экрана, поэтому, скорее всего, режим установлен правильно.

2) После SetFullscreenState вы должны вызвать ResizeBuffers с режимом сопоставления правильного размера буфера, именно здесь DXGI установит режим переворачивания. Как правило, это должно происходить естественным образом как реакция на сообщение WM_SIZE, отправленное с помощью перехода SetFullscreenState, поэтому, если ваше приложение не вызывает ResizeBuffers для WM_SIZE, это, вероятно, должно произойти. Вы можете вызвать ResizeBuffers вручную после SetFullscreenState, и это также должно работать.

И да, в MSDN есть хорошая статья о практике DXGI, включая полноэкранный переход: http://msdn.microsoft.com/en-us/library/cc627095(VS.85).aspx#Full_Screen_Issues

0 голосов
/ 01 июля 2009

Есть ли причина, по которой вы удаляете свой режим desc?

Вы также пытались выставить свой режим через "FindClosestMatchingMode"?

Извлечение http://msdn.microsoft.com/en-us/library/cc627095(VS.85).aspx В разделе «Проблемы с полноэкранным режимом» содержится много полезной информации.

...