在我正在开发的游戏中,我经历了严重的ram使用。我已经让它继续运行,看到它使用超过1.5 GB的ram,从最初使用30 MB开始。我已经确定了2个功能的主要原因,这些功能粘贴在下面。通过研究这个问题,我得出的结论是,其中一个问题是使用TTF_RenderText_Blended创建一个TTF表面会创建一个新的表面,而这个表面不会被释放。我如何解放这个自动制作的表面?我无法使用SDL_FreeSurface,因为我没有表面名称。
我对第二个功能中发生的事情感到困惑。我假设发生了类似的事情(一个被调用的函数并创建了一个没有被释放的第二个表面),但我不确定是什么导致它。这不是一个问题,因为我计划实现这个功能的不同版本,不需要创建任何表面..
TTF功能:
void speak(int id, string message, SDL_Renderer *ren, TTF_Font *font, SDL_Color color, int x, int y)
{
SDL_Surface *surf = TTF_RenderText_Blended(font, message.c_str(), color);
if(surf == nullptr) cout << "surf error";
SDL_Texture *texture = SDL_CreateTextureFromSurface(ren, surf);
SDL_FreeSurface(surf);
if(texture == nullptr) cout << "tex error";
SDL_Rect rect;
SDL_QueryTexture(texture, NULL, NULL, &rect.w, &rect.h);
rect.x = x-rect.w/2 - camera_xpos*10;
rect.y = y+sprite_set_array[idList[id].sprite].y_offset - rect.h - camera_ypos*10;
SDL_RenderCopy(ren, texture, NULL, &rect);
}
第二个函数(用于显示精灵):
void displayAtPos(int id, int sprite_num, int x, int y, SDL_Window *win, SDL_Renderer *ren)
{
if(idList[id].type == 5) sprite_num = 11;
string sprite = sprite_set_array[sprite_num].getString(idList[id].facing, idList[id].sprite_counter);
SDL_Texture *texture = nullptr;
SDL_Surface *bmp = SDL_LoadBMP(sprite.c_str());
if(bmp==nullptr) {bmp = SDL_LoadBMP("junk.bmp");}
SDL_SetColorKey( bmp, SDL_TRUE, SDL_MapRGB(bmp->format, 255, 0, 255) );
SDL_Texture *tex = SDL_CreateTextureFromSurface(ren, bmp);
SDL_FreeSurface(bmp);
if (tex == nullptr) { cout << "SDL_CreateTextureFromSurface Error: " << SDL_GetError() << endl; }
SDL_Rect rect;
rect.x = x;
rect.y = y+sprite_set_array[idList[id].sprite].y_offset;
SDL_QueryTexture(tex, NULL, NULL, &rect.w, &rect.h);
SDL_RenderCopy(ren, tex, NULL, &rect);
if(idList[id].active_effect > 0 && idList[id].active_effect_counter > 0) //Display a texture from the status effects array.
{
SDL_RenderCopy(ren, effect_array[idList[id].active_effect_counter%3], NULL, &rect);
idList[id].active_effect_counter--;
}
}
答案 0 :(得分:1)
您还需要destroy/free the SDL_Textures:
void SDL_DestroyTexture(SDL_Texture* texture)
如果可以的话,我还建议您存储SDL_Texture*
。这样你就不必一直重新创造它。