gpt4 book ai didi

c++ - 调整窗口大小后交换渲染缓冲区会导致问题

转载 作者:太空宇宙 更新时间:2023-11-04 13:37:53 24 4
gpt4 key购买 nike

我正在尝试处理窗口调整大小消息 WM_SIZE。当我收到它时:

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_SIZE:
{
int nWidth = LOWORD(lParam);
int nHeight = HIWORD(lParam);
renderer->Resize(nWidth, nHeight);
return 1;
break;
}
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
} break;
}

return DefWindowProc(hWnd, message, wParam, lParam);
}

我使用新的高度和宽度参数重新创建渲染目标视口(viewport)并调整缓冲区大小:

void Renderer::Resize(int w, int h)
{
m_devContext->OMSetRenderTargets(0, 0, 0);

m_renderTargetView->Release();

HRESULT hr;
hr = m_swapchain->ResizeBuffers(1, w, h, DXGI_FORMAT_UNKNOWN, 0);

ID3D11Texture2D* pBuffer;
hr = m_swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D),
(void**)&pBuffer);

hr = m_device->CreateRenderTargetView(pBuffer, NULL,
&m_renderTargetView);

pBuffer->Release();

m_devContext->OMSetRenderTargets(1, &m_renderTargetView, NULL);

// Set up the viewport.
D3D11_VIEWPORT vp;
vp.Width = w;
vp.Height = h;
m_devContext->RSSetViewports(1, &vp);

}

尽管如此,调整大小事件后呈现的第一帧会导致错误:

void Renderer::Render() const
{

m_devContext->ClearRenderTargetView(m_renderTargetView, m_clearCol);
HRESULT ret = m_swapchain->Present(0, 0); //triggered exception here, only the first frame after resize
}

Visual Studio 弹出错误是:

ApplicationName.exe has triggered an exception

.没有其他信息,也没有可捕获的异常。根据网络上的一些研究,我猜想这可能与某些未释放的资源或堆损坏有关。

有什么提示吗?我究竟做错了什么?


编辑:我错过了控制台输出。这是确认是堆损坏问题的消息:

HEAP: Free Heap block 44aa468 modified at 44aa4e8 after it was freed application.exe has triggered a breakpoint.

我遵循的文档来自这个 MSDN article .

最佳答案

不要返回 1,在 WM_SIZE 消息中使用此 return DefWindowProc(blah..)。完成调整大小指令后,Windows 需要自行处理

关于c++ - 调整窗口大小后交换渲染缓冲区会导致问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28902149/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com