【问题标题】:D3D11 WARNING when resizing the window调整窗口大小时出现 D3D11 警告
【发布时间】: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。早该想到的。

标签: c++ winapi directx


【解决方案1】:

一个问题是这条线没有做你认为它做的事情:

pImmediateContex->OMSetRenderTargets(0, 0, 0);

必须是:

ID3D11RenderTargetView* nullViews [] = { nullptr };
pImmediateContex->OMSetRenderTargets(1, nullViews, 0);

【讨论】:

  • 谢谢你,但它并没有摆脱警告。但我通过在从另一个纹理创建新的 zBuffer 之前释放之前的 zBuffer 来解决它。
猜你喜欢
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多