2016-01-09 3 views
0

Я создал простое приложение Win32 и попытаюсь заполнить область клиента цветом. Когда включена строка «Clear RenderTarget», я вижу, что при каждом изменении размера окна память увеличивается на несколько килобайт.Память увеличивается при каждом изменении размера окна

Мой WindowProc:

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (uMsg) 
    { 
     case WM_SIZE: 
     { 
      if (pRenderTarget != NULL) 
      { 
       RECT rc; 
       GetClientRect(globalWindowHandle, &rc); 

       D2D1_SIZE_U size = D2D1::SizeU(rc.right, rc.bottom); 

       pRenderTarget->Resize(size); 

       InvalidateRect(globalWindowHandle, NULL, FALSE); 
      } 
      return 0; 
     } 
     break; 
     case WM_CREATE: 
     { 
      HRESULT dx = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pFactory); 

      if (FAILED(dx)) 
      { 
       MessageBox(globalWindowHandle, "Error creating D2D1Factory", "Error", MB_ICONERROR); 
       return -1; 
      } 

      return 0; 
     } 
     break; 
     case WM_KEYDOWN: 
     { 
      int ret = HandleKeyboardInput(uMsg, wParam, lParam); 

      if (ret == 0) 
      { 
       return 0; 
      } 
     } 
     break; 
     case WM_PAINT: 
     { 
      HRESULT hr = CreateGraphicsResources(); 

      if (SUCCEEDED(hr)) 
      { 

       PAINTSTRUCT ps; 
       HDC hdc = BeginPaint(hwnd, &ps); 

       pRenderTarget->BeginDraw(); 

       // Clear RenderTarget 
       pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::SkyBlue)); 

       hr = pRenderTarget->EndDraw(); 

       if (FAILED(hr) || hr == D2DERR_RECREATE_TARGET) 
       { 
        pRenderTarget->Release(); 
        pSolidBrush->Release(); 
        pRenderTarget = NULL; 
        pSolidBrush = NULL; 
       } 

       EndPaint(hwnd, &ps); 

       return 0; 
      } 

     } 
     break; 
     case WM_CLOSE: 
     { 
      int box = MessageBox(hwnd, "Would you like to close the editor ?", "Question", MB_OKCANCEL); 
      if (box == IDOK) 
      { 
       DestroyWindow(hwnd); 
      } 
      return 0; 
     } 
     break; 
     case WM_DESTROY: 
     { 
      PostQuitMessage(0); 
      return 0; 
     } 
     break; 
     default: 
     { 
      return DefWindowProc(hwnd, uMsg, wParam, lParam); 
     } 
     break; 
    } 

    return 0; 
} 

CreateGraphicsResources

HRESULT CreateGraphicsResources() 
{ 
    HRESULT hr = S_OK; 

    if (pRenderTarget == NULL) 
    { 
     RECT rc; 
     GetClientRect(globalWindowHandle, &rc); 

     D2D1_SIZE_U size = D2D1::SizeU(rc.right, rc.bottom); 

     hr = pFactory->CreateHwndRenderTarget(
      D2D1::RenderTargetProperties(), 
      D2D1::HwndRenderTargetProperties(globalWindowHandle, size), 
      &pRenderTarget); 

     if (SUCCEEDED(hr)) 
     { 
      const D2D1_COLOR_F color = D2D1::ColorF(1.0f, 1.0f, 1.0f, 0); 
      hr = pRenderTarget->CreateSolidColorBrush(color, &pSolidBrush); 

      if (SUCCEEDED(hr)) 
      { 

      } 
     } 


    } 
    return hr; 
} 

Globals:

BOOL ctrlPressed = FALSE; 
HWND globalWindowHandle; 
ID2D1Factory *pFactory; 
ID2D1SolidColorBrush *pSolidBrush; 
ID2D1HwndRenderTarget *pRenderTarget; 

ли я что-то пропустил, чтобы освободить память или то, что может быть причиной? Если я изменил размер окна, например. 5 сек. Память идет от 4 КБ до 22 КБ.

Моя ОС Windows, 10 x64

+1

Код выглядит нормально вообще, но он не будет компилироваться, в частности 'CreateGraphicsResources()' не имеет возврата. Таким образом, я подозреваю, что в вашем коде есть что-то еще, что может вызвать утечку памяти. –

+0

Да, я изменил это, но все равно не повезло. – NikkiBauer

+1

О какой памяти вы говорите? Где вы получаете 4 КБ и 22 КБ? –

ответ

1

Вопрос, кажется, решена. На самом деле память не увеличилась намного больше, поэтому ОС назначает другую память.

Смежные вопросы