0

私は巨大なメモリ リークを抱えてSDL_TTFおり、全体としての実装に疑問を投げかけています。

現在、私は次のクラスを持っています

MainMenu
Menu
Options
Button 
Text

MainMenuおよびクラスはOption、メニュー クラスを抽象化し、テキスト クラスを構築するパラメーターを使用して、それぞれ独自のボタン クラスを呼び出します。

したがって、現在、私のメイン ループはSDL_RendererMainMenu->Button->Text パスを介して (gRenderer) を渡します。

TTF_RenderText_SolidText クラスが初期化されると、フォントが読み込まれ、Button クラスによって渡されたメッセージを使用してフォントTTF_SetFontStyleが設定され、テキストを太字に設定します。

私は以下を使用して描画します:

void Text::draw(SDL_Renderer* gRenderer)
{   
renderQuad = { getXPosition(), getYPosition() };//, getWidth(), getHeight()};   
mTexture = SDL_CreateTextureFromSurface(gRenderer, message);
SDL_RenderCopyEx(gRenderer, mTexture, NULL, 
                    &renderQuad, NULL, NULL,  SDL_FLIP_NONE);
};

SDL_CreateTextureFromSurfaceまたはで膨らんでいると思いますSDL_RenderCopyEx

このメモリ リークを修正するにはどうすればよいですか? 私は露骨な何かを見落としていますか?

解決:

Twinklebear の ifnroamtion の発見/使用:

ヘッダーでオブジェクトを宣言するときに、テクスチャを宣言し、それをNULLByと等しくなるように設定しました。SDL_Texture* mTexture = NULL;

次に、描画関数内で、テクスチャが NULL に設定されているかどうかを確認します。

void Text::draw(SDL_Renderer* gRenderer)
{    

renderQuad = { getXPosition(), getYPosition(), message->w, message->h };

if (mTexture == NULL)
{
    mTexture = SDL_CreateTextureFromSurface(gRenderer, message);
}

SDL_RenderCopy(gRenderer, mTexture, NULL, &renderQuad);
};

私がやりたいのは、クラスにブール変数をスローして、テクスチャを更新する必要があるかどうかを示し、テクスチャをリセットすることです。

4

1 に答える 1

0

フレームごとに描画関数を呼び出している場合、大量のテクスチャを作成しているのにそれらを解放していないため、メモリ リークが発生します。

mTexture = SDL_CreateTextureFromSurface(gRenderer, message);

後で で解放する必要があるメッセージの新しいテクスチャを作成しSDL_DestroyTextureます。このテクスチャを解放しないと、メモリがリークし、フレームごとにテクスチャをリークすると、すぐに追加され始めます。

これを修正するには、フレームごとに同じテクスチャを再作成する必要がないため、表示されるメッセージを変更しない限り、サーフェスをテクスチャにリロードしないでください (フレームごとにこれを行うのもかなり遅いです)。

于 2014-06-02T00:53:43.117 に答える