#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 непосредственно перед созданием нового из другой текстуры.