1

開発中のゲームで深刻な 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--;
    }
}
4

1 に答える 1