【发布时间】:2021-12-27 23:42:42
【问题描述】:
如果我调整窗口大小并关闭应用程序,我会收到以下错误:
D3D11 WARNING: Process is terminating. Using simple reporting. Please call ReportLiveObjects()
at runtime for standard reporting. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Producer at 0x011B0794, Refcount: 2. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x011D85C0, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x03C88848, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x011E8234, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x03C77BE4, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x03C6FC94, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x03C8F844, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x03C8F9AC, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x03C8FC78, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x03C91754, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x03C78554, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x03C70854, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x03C924B4, Refcount: 1. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x03C92674, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x03C92E5C, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x03C99424, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x03CA8C44, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x03CA6824, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x03CA6B04, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x03C9B0AC, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x03CA8FFC, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x03C9B8FC, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x03CA79D4, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x03C76C64, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x03C7744C, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x03C9A354, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x03CB25B4, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x07D032CC, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x07D0390C, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x03C9A964, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x03C9DF44, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x07D540F4, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x07D0B13C, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x03CCEDE4, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x03CA34CC, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x07D02F2C, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object at 0x07D0B41C, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live Object : 36 [ STATE_CREATION WARNING #0: UNKNOWN]
DXGI WARNING: Live Producer at 0x011A5138, Refcount: 4. [ STATE_CREATION WARNING #0: ]
DXGI WARNING: Live Object at 0x011B2328, Refcount: 2. [ STATE_CREATION WARNING #0: ]
DXGI WARNING: Live Object : 1 [ STATE_CREATION WARNING #0: ]
The program '[10544] DX_Lab9_Lighting.exe' has exited with code 0 (0x0).
这是我的调整大小代码:
if (pSwapChain)
{
pImmediateContex->OMSetRenderTargets(0, 0, 0);
//Release all outstanding buffers
pBackBufferRTView->Release();
HRESULT hr = S_OK;
//if 0, DXGI will use the width of the client area
hr = pSwapChain->ResizeBuffers(0, 0, 0, DXGI_FORMAT_UNKNOWN, 0);
if (FAILED(hr)) return hr;
//Get buffer and create a render-target-view
ID3D11Texture2D* pBackBufferTexture;
//Returns pointer to the back buffer
hr = pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&pBackBufferTexture);
if (FAILED(hr)) return hr;
//Use back buffer texture pointer to create the renedr target view
hr = pD3DDevice->CreateRenderTargetView(pBackBufferTexture, NULL, &pBackBufferRTView);
if (FAILED(hr)) return hr;
//Clean up
pBackBufferTexture->Release();
//Clear the Z buffer
pImmediateContex->ClearDepthStencilView(pZBuffer, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);
RECT rc;
GetClientRect(hWnd, &rc);
screenWidth = rc.right - rc.left;
screenHeight = rc.bottom - rc.top;
stringstream a;
a << std::to_string(screenWidth) << " " << std::to_string(screenHeight) << "\n";
OutputDebugString(a.str().c_str());
camera->SetProjectionValues(90.0f, static_cast<float>(screenWidth) / static_cast<float>(screenHeight), 0.01f, 1000.0f);
//Create a Z buffer texture
D3D11_TEXTURE2D_DESC tex2DDesc;
ZeroMemory(&tex2DDesc, sizeof(tex2DDesc));
tex2DDesc.Width = screenWidth;
tex2DDesc.Height = screenHeight;
tex2DDesc.ArraySize = 1;
tex2DDesc.MipLevels = 1;
tex2DDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; //24 bits of each pixel
tex2DDesc.SampleDesc.Count = 1;
tex2DDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
tex2DDesc.Usage = D3D11_USAGE_DEFAULT;
ID3D11Texture2D* pZBufferTexture;
hr = pD3DDevice->CreateTexture2D(&tex2DDesc, NULL, &pZBufferTexture);
if (FAILED(hr)) return hr;
//Create the Z buffer
D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
ZeroMemory(&dsvDesc, sizeof(dsvDesc));
dsvDesc.Format = tex2DDesc.Format;
dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
pD3DDevice->CreateDepthStencilView(pZBufferTexture, &dsvDesc, &pZBuffer);
pZBufferTexture->Release();
//Set the render target view
pImmediateContex->OMSetRenderTargets(1, &pBackBufferRTView, pZBuffer);
//Set the viewport
D3D11_VIEWPORT viewport;
viewport.TopLeftX = 0;
viewport.TopLeftY = 0;
viewport.Width = (FLOAT)screenWidth;
viewport.Height = (FLOAT)screenHeight;
viewport.MinDepth = .0f;
viewport.MaxDepth = 1.0f;
pImmediateContex->RSSetViewports(1, &viewport);
}
我注意到,我调整窗口大小的次数越多,收到的警告就越多。我在某处读到所有 Get() 方法都会增加 refCount,这意味着需要释放一些东西,但我不知道我错过了什么。同样,这只发生在我调整窗口大小时,所以问题可能出在我处理它的方式上。
【问题讨论】:
-
程序退出时会出现一组固定的警告,例如...... kindof ... 预期的。但是,如果它们由于某些运行时操作而增加,则不会出现这种情况。很难说不能复制。启用调试层,恕我直言,您应该在 COM 引用(如 WRL 的 ComPtr 或 ATL 的 CComPtr 或 C++/WinRT)上使用智能指针,以确保您不会遗漏任何内容。
-
我将使用 ComPtr 进行最终评估。现在我只是为了学习目的而做所有事情,并且很难发现问题。顺便说一句,问题是我在窗口调整大小期间创建新的 zBuffer 时没有释放以前的 zBuffer。早该想到的。