開発中のゲームで深刻な RAM の使用が発生しています。私はそれを実行したままにして、最初の使用量 30 MB から 1.5 GB を超える RAM を使用しているのを見ました。主な原因を 2 つの機能に特定しました。以下に貼り付けます。この問題を調査した結果、問題の 1 つは、TTF_RenderText_Blended を使用して TTF サーフェスを作成すると、解放されない新しいサーフェスが作成されることであるという結論に達しました。この自動的に作成されたサーフェスを解放するにはどうすればよいですか? サーフェス名がないため、SDL_FreeSurface を使用できません。
2番目の関数で何が起こっているのか、もう少し混乱しています。似たようなことが起こっていると思います (関数が呼び出され、解放されていない 2 番目のサーフェスを作成する) が、何が原因かはわかりません。サーフェスを作成する必要のないこの関数の別のバージョンを実装することを計画しているので、これはそれほど問題ではありません..
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);
}
2 番目の関数 (スプライトの表示に使用):
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--;
}
}