我有一个巨大的内存泄漏,这使我质疑我的SDL_TTF
整体的实现。
现在我有以下课程
MainMenu
Menu
Options
Button
Text
MainMenu
和Option
类抽象菜单类,并使用构建文本类的参数调用自己的按钮类。
所以现在我的主循环将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_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);
};
我想做的是在类上抛出一个布尔变量来表明纹理是否需要更新,并重置纹理。
答案 0 :(得分:0)
如果你每帧调用绘图函数,你会创建大量纹理但不会释放它们,导致内存泄漏。
mTexture = SDL_CreateTextureFromSurface(gRenderer, message);
创建一个新的消息纹理,你需要稍后使用SDL_DestroyTexture
释放,如果你没有释放这个纹理你会泄漏内存,如果你每帧都泄漏一个纹理它会开始加起来非常快。
要解决此问题,除非您更改显示的消息,否则不应将曲面重新加载到纹理中,因为不需要每帧重新创建相同的纹理(每帧执行此操作的速度也相当慢)。 / p>