SDL2 程序最小化时占用大量内存
SDL2 program eats a lot of memory when minimized
我只是想用简单的渲染器创建一个简单的 SDL2 window。当我调试它时,它运行正常,内存仍然正常。但是当我最小化它时,按下最小化按钮然后突然内存一直在上升,只有当我重新打开它时 window 然后内存恢复正常。
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;
}
我刚刚 运行 你的代码并编译了它。看起来不错。但是你确实提到过当你最小化你的 ram meter 增加的程序时,你能在它崩溃之前重复执行多长时间?它甚至会崩溃吗?这可能是正常行为。如果您的程序崩溃,则可能是内存泄漏,这可能表明忘记取消分配一些其他指向内存的指针 object/variable。
switch (m_event.window.event)
{
case SDL_WINDOWEVENT_MINIMIZED:
while (SDL_WaitEvent(&m_event))
{
if (m_event.window.event == SDL_WINDOWEVENT_RESTORED)
{
break;
}
}
break;
...
因此,当您最小化 Window 时,SDL 会一直等待事件。没有进一步的代码可以内存泄漏,因为它停留在延迟轮询循环中,直到 window 被恢复。
我将泄漏追溯到 SDL_RenderClear,在最小化时不应该 运行。
我只是想用简单的渲染器创建一个简单的 SDL2 window。当我调试它时,它运行正常,内存仍然正常。但是当我最小化它时,按下最小化按钮然后突然内存一直在上升,只有当我重新打开它时 window 然后内存恢复正常。
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;
}
我刚刚 运行 你的代码并编译了它。看起来不错。但是你确实提到过当你最小化你的 ram meter 增加的程序时,你能在它崩溃之前重复执行多长时间?它甚至会崩溃吗?这可能是正常行为。如果您的程序崩溃,则可能是内存泄漏,这可能表明忘记取消分配一些其他指向内存的指针 object/variable。
switch (m_event.window.event)
{
case SDL_WINDOWEVENT_MINIMIZED:
while (SDL_WaitEvent(&m_event))
{
if (m_event.window.event == SDL_WINDOWEVENT_RESTORED)
{
break;
}
}
break;
...
因此,当您最小化 Window 时,SDL 会一直等待事件。没有进一步的代码可以内存泄漏,因为它停留在延迟轮询循环中,直到 window 被恢复。 我将泄漏追溯到 SDL_RenderClear,在最小化时不应该 运行。