내 Direct3D 11 응용 프로그램이 전체 화면 모드에서 창 모드로 전환 될 때마다 IDXGISwapChain :: ResizeBuffers가 중단 점을 트리거합니다. Visual Studio 콘솔에서 "중요 오류 0xc0000374"라는 메시지가 인쇄되고 다른 정보는 표시되지 않습니다. 분명히 이것은 힙 손상이 발생했음을 의미합니다. 좋아. 창문이 불쾌하게 내 견해를 가리고 Visual Studio 창을 제어 할 수 없기 때문에 왜 이런 일이 발생했는지에 대한 더 이상의 정보를 얻을 수 없습니다.IDXGISwapChain :: ResizeBuffers는 전체 화면에서 창으로 전환 할 때 중단 점을 트리거합니다.
저는 this MSDN page에서 제안했습니다. 그 말은 내가 코드를 복사하여 붙여 넣었다는 뜻입니다.
이 내 설정 코드 (오류 검사의 부족을 무시) :
DXGI_SWAP_CHAIN_DESC swap_chain_desc = { 0 };
swap_chain_desc.BufferCount = 2;
swap_chain_desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
swap_chain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swap_chain_desc.OutputWindow = window::get();
swap_chain_desc.SampleDesc.Count = 1;
swap_chain_desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
swap_chain_desc.Windowed = TRUE;
swap_chain_desc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
if (fullscreen == 1) {
swap_chain_desc.BufferDesc.Width = window::desktop_width();
swap_chain_desc.BufferDesc.Height = window::desktop_height();
} else {
swap_chain_desc.BufferDesc.Width = window::width();
swap_chain_desc.BufferDesc.Height = window::height();
}
HRESULT hr = D3D11CreateDeviceAndSwapChain (
NULL,
D3D_DRIVER_TYPE_HARDWARE,
NULL,
NULL,
NULL,
NULL,
D3D11_SDK_VERSION,
&swap_chain_desc,
&m_swap_chain,
&m_device,
NULL,
&m_context
);
ID3D11Texture2D* back_buffer;
hr = m_swap_chain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&back_buffer);
hr = m_device->CreateRenderTargetView(back_buffer, NULL, &m_view);
back_buffer->Release();
m_context->OMSetRenderTargets(1, &m_view, NULL);
D3D11_VIEWPORT viewport = { 0 };
viewport.TopLeftX = 0;
viewport.TopLeftY = 0;
viewport.MinDepth = 0.0f;
viewport.MaxDepth = 1.0f;
if (fullscreen == 1) {
viewport.Width = window::desktop_width();
viewport.Height = window::desktop_height();
} else {
viewport.Width = window::width();
viewport.Height = window::height();
}
m_context->RSSetViewports(1, &viewport);
if (fullscreen == 1) {
m_swap_chain->SetFullscreenState(TRUE, NULL);
}
아무것도이 문제의 원인이 생각하고 거기에 있습니까? 렌더링 코드는 ClearRenderTargetView이며 PeekMessage 루프 후에 나타납니다. 중요하지 않습니다.
장치 및 스왑 체인을 만들 때 디버그 플래그를 켜면 오류에 대한 자세한 정보를 얻을 수 있습니다. 'UINT flags = D3D11_CREATE_DEVICE_BGRA_SUPPORT; #if 정의 (DEBUG) || 정의 됨 (_DEBUG) \t flags | = D3D11_CREATE_DEVICE_DEBUG; #endif \t HRESULT hr; \t 경우 (실패 (시간 = D3D11CreateDeviceAndSwapChain (NULL, \t D3D_DRIVER_TYPE_HARDWARE, \t \t NULL, \t \t 플래그 ...'나는이 켜져, 내가 얻을 수있는 유일한 추가 정보가 할당되지 않은 것을 것을이 – zdd
@zdd 힙의 일부가 작성되었습니다. 모든 코드를 추적하고 나에게주는 주소는 아무 것도 관련이 없습니다. 중단 점이 IDXGISwapChain :: ResizeBuffers에 의해 확실히 트리거되고 있습니다 (어떤 주소도 전달하지 않고 객체 자체 그 라인과 그 부양 가족을 제거하면 충돌을 없애기 때문에). – NmdMystery
관련 코드를 더 게시 할 수 있습니까? – zdd