我创建这样的纹理:
//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,显然表面存储器没有被释放。
有什么想法吗?
答案 0 :(得分:2)
这与OpenGL无关。
您对SDL_DisplayFormatAlpha的调用会返回一个新的SDL_Surface,因此您的原始曲面仍然会被分配。这意味着您将泄漏每张图像的副本。
您应该执行以下操作:
SDL_Surface* surfaceWithAlpha = SDL_DisplayFormatAlpha(surface);
SDL_FreeSurface(surface);
...rest of code use surfaceWithAlpha
SDL_FreeSurface(surfaceWithAlpha);
请参阅documentation。
答案 1 :(得分:1)
我一开始并没有注意到解决方法对您来说已经足够了。
然后,调用glTexImage2D
,提供等于0的纹理大小应该强制OpenGL释放内存。然后,您可以删除它。如果它不起作用,泄漏就在您的代码中。