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 回答