我有一个巨大的内存泄漏,这让我质疑我SDL_TTF
的整体实现。
现在我有以下课程
MainMenu
Menu
Options
Button
Text
和类抽象了菜单类MainMenu
,Option
每个类都使用构建文本类的参数调用自己的按钮类。
所以现在我的主循环通过SDL_Renderer
MainMenu->Button->Text 路径向下传递 (gRenderer)。
当我的 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_CreateTextureFromSurface
或SDL_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);
};
我想做的是在类上抛出一个布尔变量来说明纹理是否需要更新,然后重置纹理。