最小化时,SDL2程序会占用大量内存

时间:2020-05-08 12:08:13

标签: c++ memory rendering sdl sdl-2

我只是想用一个简单的渲染器创建一个简单的SDL2窗口。当我调试它时,它可以正常运行,内存仍然正常。但是,当我最小化它时,按下最小化按钮,然后内存突然保持上升,只有当我重新打开该窗口时,内存才恢复正常。

Memory spike

代码:

#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 :(得分:0)

我只是运行您的代码并对其进行了编译。看起来不错。但是,您确实提到过,当最小化夯表增加的程序时,您能够执行此重复操作多长时间才崩溃?甚至崩溃吗?这可能是正常行为。如果您的程序崩溃,则可能是内存泄漏,这可能表明您忘记了取消分配其他指向内存对象/变量的指针。

答案 1 :(得分:0)

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;

因此,当您最小化Window时,SDL会一直等待事件。没有其他代码可能会发生内存泄漏,因为它会保留在延迟轮询循环中,直到恢复窗口为止。 我将泄漏追溯到SDL_RenderClear,它不应在最小化的情况下运行。

相关问题