【发布时间】:2012-08-28 19:46:28
【问题描述】:
我创建这样的纹理:
//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,显然表面内存没有被释放。
有什么想法吗?
【问题讨论】:
-
这是操作系统释放 RAM 的工作,因此解决方案可能是特定于操作系统的
-
我使用的是 Windows 7 Professional 64bit, SP1
-
您如何测量内存使用情况?请记住,仅查看任务列表可能会给您带来错误的结果 --- SDL 正在释放内存是完全可行的,只是不将其交还给系统(这可能非常困难) .这意味着您不会看到任务列表内存使用量减少,但内存仍可供您的应用程序重用。
-
@DavidGiven “RAM 使用量不断增加,直到游戏崩溃(大约 300mb/级)”表明它确实在泄漏。
-
我正在使用 Process Explorer,当它达到我的物理内存的大约 90% 并且我加载了一个新级别时,大多数纹理都是白色的,一段时间后它崩溃并给我不同的错误,比如访问冲突或堆栈溢出。