ПРЕДУПРЕЖДЕНИЕ D3D11 при изменении размера окна

#c #winapi #directx

Вопрос:

Если я изменю размер окна и закрою приложение, я получу эти ошибки:

 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-gt;OMSetRenderTargets(0, 0, 0);  //Release all outstanding buffers  pBackBufferRTView-gt;Release();   HRESULT hr = S_OK;  //if 0, DXGI will use the width of the client area  hr = pSwapChain-gt;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-gt;GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)amp;pBackBufferTexture);   if (FAILED(hr)) return hr;   //Use back buffer texture pointer to create the renedr target view  hr = pD3DDevice-gt;CreateRenderTargetView(pBackBufferTexture, NULL, amp;pBackBufferRTView);    if (FAILED(hr)) return hr;  //Clean up  pBackBufferTexture-gt;Release();    //Clear the Z buffer  pImmediateContex-gt;ClearDepthStencilView(pZBuffer, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);    RECT rc;  GetClientRect(hWnd, amp;rc);  screenWidth = rc.right - rc.left;  screenHeight = rc.bottom - rc.top;  stringstream a;  a lt;lt; std::to_string(screenWidth) lt;lt; " " lt;lt; std::to_string(screenHeight) lt;lt; "n";  OutputDebugString(a.str().c_str());  camera-gt;SetProjectionValues(90.0f, static_castlt;floatgt;(screenWidth) / static_castlt;floatgt;(screenHeight), 0.01f, 1000.0f);   //Create a Z buffer texture   D3D11_TEXTURE2D_DESC tex2DDesc;  ZeroMemory(amp;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-gt;CreateTexture2D(amp;tex2DDesc, NULL, amp;pZBufferTexture);   if (FAILED(hr)) return hr;   //Create the Z buffer  D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;  ZeroMemory(amp;dsvDesc, sizeof(dsvDesc));   dsvDesc.Format = tex2DDesc.Format;  dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;   pD3DDevice-gt;CreateDepthStencilView(pZBufferTexture, amp;dsvDesc, amp;pZBuffer);  pZBufferTexture-gt;Release();   //Set the render target view   pImmediateContex-gt;OMSetRenderTargets(1, amp;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-gt;RSSetViewports(1, amp;viewport);  }  

Я заметил, что чем больше раз я изменяю размер окна, тем больше предупреждений я получаю. Я где-то читал, что все методы Get() увеличивают количество ссылок, что означает, что что-то должно быть выпущено, но я не знаю, что я пропустил. Опять же, это происходит только тогда, когда я изменяю размер окна, так что проблема, вероятно, в том, как я с этим справляюсь.

Комментарии:

1. Фиксированный набор предупреждений, подобных этим, при выходе из программы … вроде того … ожидаемый. Но если они увеличатся из-за какого-то действия во время выполнения, этого не ожидается. Трудно сказать, не будучи в состоянии воспроизвести. Включите уровень отладки, и IMHO, вы должны использовать интеллектуальные указатели над ссылками COM (например, ComPtr WRL или CComPtr ATL или C /WinRT), чтобы убедиться, что вы ничего не пропустите.

2. Я буду использовать ComPtr для своей окончательной оценки. на данный момент я просто делаю все в основном в учебных целях, и мне становится трудно обнаружить проблемы. кстати, проблема заключалась в том, что я не выпустил предыдущий zBuffer при создании нового во время изменения размера окна. надо было об этом подумать.

Ответ №1:

Проблема в том, что эта строка делает не то, что вы думаете:

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

Это должно быть:

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

Комментарии:

1. Спасибо за это, но это не избавило от предупреждений. Но я решил эту проблему, выпустив предыдущий zBuffer непосредственно перед созданием нового из другой текстуры.