2

次のようなテクスチャを作成します。

//Create temp SDL_Surface
SDL_Surface* surface = IMG_Load(this->path.c_str());

//If we successfully loaded an image
if (surface)
{
    SDL_DisplayFormatAlpha(surface);

    bounds = GameRectangle(surface->w, surface->h);

    GLuint object(0);

    glGenTextures(1, &object);

    glBindTexture(GL_TEXTURE_2D, object);

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, surface->w, surface->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, surface->pixels);

    SDL_FreeSurface(surface);

    return object;
}

glDeleteTextures()はVRAMを適切に解放しますが、システムRAMは残り、ゲームがクラッシュするまで蓄積されます。

SDL_Surfaceに配置しましたが、表面メモリが解放されていないようです。

何か案は?

4

2 に答える 2

2

これはOpenGLとは何の関係もありません。

SDL_DisplayFormatAlphaを呼び出すと、新しいSDL_Surfaceが返されるため、元のサーフェスは引き続き割り当てられます。これは、すべての画像のコピーをリークすることを意味します。

次のようなことをする必要があります。

SDL_Surface* surfaceWithAlpha = SDL_DisplayFormatAlpha(surface);
SDL_FreeSurface(surface);
...rest of code use surfaceWithAlpha 
SDL_FreeSurface(surfaceWithAlpha);

ドキュメントを参照してください。

于 2012-08-28T11:46:28.677 に答える
1

最初は、回避策で十分だとは思いませんでした。

次に、を呼び出しglTexImage2Dて、0に等しいテクスチャサイズを指定すると、OpenGLがメモリを解放するように強制されます。その後、削除できます。それが機能しない場合、リークはコードにあります。

于 2012-08-28T10:39:30.493 に答える