C ++ / WinApi Использование памяти растет при перемещении окна - PullRequest
0 голосов
/ 24 ноября 2018

Итак, я играл с моим тестовым приложением и заметил, что использование оперативной памяти растет, когда я перемещаю свое окно к краям экрана.

Кроме того, при использовании оперативной памяти в 19 МБ шрифты исчезают, и приложение становится глючным.

Однако этого не происходит, когда окно не касается краев экрана.

Вот видео на YouTube со мной, показывающее, что я имею в виду.

Я думаю, что мой код просто не очень эффективен.

Код для рисования текста:

void drawText(LPCWSTR text, LPCWSTR fontName,int fontSize, int x, int y, HDC hdc) {

    //Creat font from name and size

    HFONT font =  CreateFont(
        fontSize,
        0,
        0,
        0,
        FW_NORMAL, 
        FALSE,
        FALSE,
        FALSE,
        ANSI_CHARSET,
        OUT_CHARACTER_PRECIS,
        CLIP_CHARACTER_PRECIS,
        CLEARTYPE_QUALITY,
        DEFAULT_PITCH,
        fontName);

    //Change Current Font

    HFONT oldFont = (HFONT) SelectObject(hdc, font);

    //Draw Text
    TextOut(hdc,
        x,
        y,
        text,
        wcslen(text));

    //Set back old font
    SelectObject(hdc, oldFont);
}

Реализация:

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

      int y = 10;

      drawText(L"Hey, im Roboto", L"Roboto", 50, 10, y, hdc);
      y += 80;
      drawText(L"Hey, im Arial", L"Arial",50, 10, y, hdc);
      y += 80;
      drawText(L"Hey, im Lucida Grande", L"Lucida Grande", 50, 10, y, hdc);

      EndPaint(hwnd, &ps);

      break;

1 Ответ

0 голосов
/ 24 ноября 2018

Кажется, это обычный случай утечки памяти .Согласно MSDN :

Сообщение WM_PAINT отправляется, когда система или другое приложение отправляет запрос на рисование части окна приложения.

Это означает, что сообщение WM_PAINT будет отправлено вашей функции обратного вызова WindowProc каждый раз, когда система захочет запросить программу перерисовать окно.И если вы перемещаете окно с помощью мыши, оно перерисовывается каждый раз, когда окно вообще меняет положение!Вы можете поиграться с Control Spy v2.0 , чтобы убедиться, что это действительно так.

В любом случае вы создаете новый шрифт каждый раз, когда окно необходимо перерисовать для любая причина.Например, когда это перемещается даже немного.Таким образом, использование памяти будет быстро увеличиваться.Принимая во внимание, что если вы удалите шрифт, используя DeleteObject после применения его к тексту, он освобождает шрифт из памяти, поэтому реального увеличения памяти не заметно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...