Программа SDL2 при сворачивании кушает много памяти - PullRequest
0 голосов
/ 08 мая 2020

Я просто пытаюсь создать простое окно SDL2 с помощью простого средства визуализации. Когда я его отлаживаю, он работает нормально, память все еще в норме. Но когда я минимизирую его, нажимаю кнопку минимизации, а затем внезапно память просто продолжает расти, и только когда я снова открываю это окно, память возвращается в нормальное состояние.

Всплеск памяти

Код:

#include <SDL.h>
#include <SDL_image.h>
int main(int argc, char* args[]) {
    SDL_Window* gWindow;
    SDL_Renderer* gRenderer;
    SDL_Texture* gTexture;
    SDL_Surface* temp;
    //Init
    SDL_Init(SDL_INIT_VIDEO);
    gWindow = SDL_CreateWindow("Test", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 1366, 768, SDL_WINDOW_SHOWN);
    gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_ACCELERATED);
    IMG_Init(IMG_INIT_PNG);

    //loading medias
    temp = IMG_Load("assets/sprites/700.png");
    gTexture = SDL_CreateTextureFromSurface(gRenderer, temp);
    SDL_FreeSurface(temp);

    //The main loop
    bool quit = false;
    SDL_Event e;
    while (!quit)
    {
        while (SDL_PollEvent(&e) != 0)
        {
            if (e.type == SDL_QUIT)
            {
                quit = true;
            }
        }
        SDL_RenderClear(gRenderer);
        SDL_RenderCopy(gRenderer, gTexture, NULL, NULL);
        SDL_RenderPresent(gRenderer);
    }

    //Destroy things
    SDL_DestroyTexture(gTexture);
    gTexture = NULL;   
    SDL_DestroyRenderer(gRenderer);
    SDL_DestroyWindow(gWindow);
    gWindow = NULL;
    gRenderer = NULL;
    IMG_Quit();
    SDL_Quit();
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 23 мая 2020
switch (m_event.window.event)
        {
        case SDL_WINDOWEVENT_MINIMIZED:
            while (SDL_WaitEvent(&m_event))
            {
                if (m_event.window.event == SDL_WINDOWEVENT_RESTORED)
                {
                    break;
                }
            }
            break;
        }
        break;

Итак, когда вы сворачиваете окно, SDL продолжает ждать событий. Никакой дальнейший код не может вызвать утечку памяти, поскольку он остается в ленивом опросе l oop, пока окно не будет восстановлено. Я проследил утечку до SDL_RenderClear, который не должен работать, пока он свернут.

0 голосов
/ 09 мая 2020

Я только что запустил ваш код и скомпилировал его. Вроде нормально. Однако вы упомянули, когда минимизируете программу, увеличивается ваш счетчик плунжера, как долго вы можете выполнять это повторение, прежде чем оно выйдет из строя? и вообще треснет sh? Это могло быть нормальное поведение. Если ваша программа дает сбой, это утечка памяти, которая может указывать на то, что вы забыли освободить какой-либо другой указатель на объект / переменную памяти.

...