使用SDL_TTF作为类,内存泄漏

时间:2014-06-01 20:22:33

标签: c++ text memory-leaks sdl sdl-ttf

我有一个巨大的内存泄漏,这使我质疑我的SDL_TTF整体的实现。

现在我有以下课程

MainMenu
Menu
Options
Button 
Text

MainMenuOption类抽象菜单类,并使用构建文本类的参数调用自己的按钮类。

所以现在我的主循环将SDL_Renderer(gRenderer)向下传递到MainMenu-> Button->文本路径。

当我的Text类初始化时,它会加载字体,使用TTF_RenderText_Solid设置字体,使用Button类传入的消息,然后TTF_SetFontStyle设置文本粗体。

我使用:

void Text::draw(SDL_Renderer* gRenderer)
{   
renderQuad = { getXPosition(), getYPosition() };//, getWidth(), getHeight()};   
mTexture = SDL_CreateTextureFromSurface(gRenderer, message);
SDL_RenderCopyEx(gRenderer, mTexture, NULL, 
                    &renderQuad, NULL, NULL,  SDL_FLIP_NONE);
};

我认为它在SDL_CreateTextureFromSurfaceSDL_RenderCopyEx上膨胀。

我可以做些什么来修改内存泄漏?我忽略了一些明显的东西吗?

解决方案:

发现/使用Twinklebear的ifnroamtion:

在标题中声明对象时,我声明了纹理并将其设置为等于NULL依据:SDL_Texture* mTexture = NULL;

然后,在绘制函数内部,我检查纹理是否设置为NULL:

void Text::draw(SDL_Renderer* gRenderer)
{    

renderQuad = { getXPosition(), getYPosition(), message->w, message->h };

if (mTexture == NULL)
{
    mTexture = SDL_CreateTextureFromSurface(gRenderer, message);
}

SDL_RenderCopy(gRenderer, mTexture, NULL, &renderQuad);
};

我想做的是在类上抛出一个布尔变量来表明纹理是否需要更新,并重置纹理。

1 个答案:

答案 0 :(得分:0)

如果你每帧调用绘图函数,你会创建大量纹理但不会释放它们,导致内存泄漏。

mTexture = SDL_CreateTextureFromSurface(gRenderer, message);

创建一个新的消息纹理,你需要稍后使用SDL_DestroyTexture释放,如果你没有释放这个纹理你会泄漏内存,如果你每帧都泄漏一个纹理它会开始加起来非常快。

要解决此问题,除非您更改显示的消息,否则不应将曲面重新加载到纹理中,因为不需要每帧重新创建相同的纹理(每帧执行此操作的速度也相当慢)。 / p>