我有一个菜单,其中有很多文字被渲染,可以改变大小/颜色/位置,所以我在菜单类中创建了两个函数......:
void drawText(string text,int text_size,int x,int y, Uint8 r,Uint8 g,Uint8 b);
void updateTexts();
updateTexts()函数位于游戏循环中并包含许多drawText函数,当我启动程序时,我注意到程序内存逐渐从4mb增加到大约1gb(它应该保持在4mb)然后崩溃。我认为问题存在,因为TTF_OpenFont“不断运行,但我需要一种方法来动态创建新的字体大小,因为我的菜单会根据用户输入而改变。
有更好的方法吗?
这两个函数的代码:
void Menu::drawText(string text,int text_size,int x,int y, Uint8 r,Uint8 g,Uint8 b)
{
TTF_Font* arial = TTF_OpenFont("arial.ttf",text_size);
if(arial == NULL)
{
printf("TTF_OpenFont: %s\n",TTF_GetError());
}
SDL_Color textColor = {r,g,b};
SDL_Surface* surfaceMessage = TTF_RenderText_Solid(arial,text.c_str(),textColor);
if(surfaceMessage == NULL)
{
printf("Unable to render text surface: %s\n",TTF_GetError());
}
SDL_Texture* message = SDL_CreateTextureFromSurface(renderer,surfaceMessage);
SDL_FreeSurface(surfaceMessage);
int text_width = surfaceMessage->w;
int text_height = surfaceMessage->h;
SDL_Rect textRect{x,y,text_width,text_height};
SDL_RenderCopy(renderer,message,NULL,&textRect);
}
void Menu::updateTexts()
{
drawText("Item menu selection",50,330,16,0,0,0);
drawText("click a menu item:",15,232,82,0,0,0);
drawText("item one",15,59,123,0,0,0);
drawText("item two",15,249,123,0,0,0);
drawText("item three",15,439,123,0,0,0);
drawText("item four",15,629,123,0,0,0);
}
答案 0 :(得分:0)
每个打开的字体,创建的曲面和创建的纹理都使用内存。
如果您需要的不同资源的收集受到限制,例如只有3个不同的text_size
,创建一次然后重复使用会更好。
例如,将它们存储在某种缓存中:
std::map<int, TTF_Font*> fonts_cache_;
TTF_Font * Menu::get_font(int text_size) const
{
if (fonts_cache_.find(text_size) != fonts_cache_.end())
{
// Font not yet opened. Open and store it.
fonts_cache_[text_size] = TTF_OpenFont("arial.ttf",text_size);
// TODO: error checking...
}
return fonts_cache_[text_size];
}
void Menu::drawText(string text,int text_size,int x,int y, Uint8 r,Uint8 g,Uint8 b)
{
TTF_Font* arial = get_font(text_size)
...
}
Menu::~Menu()
{
// Release memory used by fonts
for (auto pair : fonts_cache_)
TTF_CloseFont(pair.second);
...
}
对于应该在每个方法调用上分配的动态资源,您不应该忘记释放它们。目前您没有发布TTF_Font* arial
,SDL_Texture* message
的内存;做:
void Menu::drawText(string text,int text_size,int x,int y, Uint8 r,Uint8 g,Uint8 b)
{
...
TTF_CloseFont(arial);
SDL_DestroyTexture(message);
}