gpt4 book ai didi

c++ - 在自动分配的表面上使用 SDL_FreeSurface

转载 作者:太空宇宙 更新时间:2023-11-04 11:33:54 31 4
gpt4 key购买 nike

我在开发的游戏中遇到严重的内存使用问题。我让它一直运行,看到它使用了超过 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);
}

第二个函数(用于显示 Sprite ):

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--;
}
}

最佳答案

您需要destroy/free the SDL_Textures还有:

void SDL_DestroyTexture(SDL_Texture* texture)

我还建议您尽可能存储 SDL_Texture*。这样您就不必一直重新创建它。

关于c++ - 在自动分配的表面上使用 SDL_FreeSurface,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23549673/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com