0

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

现在我有以下课程

MainMenu
Menu
Options
Button 
Text

和类抽象了菜单类MainMenuOption每个类都使用构建文本类的参数调用自己的按钮类。

所以现在我的主循环通过SDL_RendererMainMenu->Button->Text 路径向下传递 (gRenderer)。

当我的 Text 类初始化时,它会加载字体,使用TTF_RenderText_SolidButton 类传入的消息设置字体,并将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:

在标题中声明对象时,我声明了纹理并将其设置为等于NULLSDL_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);
};

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

4

1 回答 1

0

如果您在每一帧都调用绘图函数,您将创建大量纹理但没有释放它们,从而导致内存泄漏。

mTexture = SDL_CreateTextureFromSurface(gRenderer, message);

创建消息的新纹理,稍后您需要使用SDL_DestroyTexture释放该纹理,如果不释放此纹理,则会泄漏内存,并且如果每帧都泄漏纹理,它将开始非常快地加起来。

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

于 2014-06-02T00:53:43.117 回答