OpenGL VBO 内存泄漏
Posted
技术标签:
【中文标题】OpenGL VBO 内存泄漏【英文标题】:OpenGL VBO Memory Leak 【发布时间】:2012-10-21 02:48:34 【问题描述】:我为学习 VBO 而编写的一个非常简单的 OpenGL 应用程序的内存存在一些问题。它使用的内存很容易增加,它打开的时间越长。下面是我使用 Windows 任务管理器看到的重复代码:
int main()
sf::RenderWindow window(sf::VideoMode(800, 600, 32), "Test");
///Setup the scene, materials, lighting
Scene scene;
scene.resize(800,600);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glColorMaterial(GL_FRONT_AND_BACK, GL_EMISSION);
glEnable(GL_COLOR_MATERIAL);
glShadeModel(GL_FLAT);
glEnable(GL_LIGHT0);
float XL = .5, YL = .1, ZL = 1;
GLfloat ambientLight[] = 0.2f, 0.2f, 0.2f, 1.0f ;
GLfloat diffuseLight[] = 0.8f, 0.8f, 0.8, 1.0f ;
GLfloat specularLight[] = 0.5f, 0.5f, 0.5f, 1.0f ;
GLfloat lightpos[] = XL, YL, ZL, 0.;
glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);
glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)wglGetProcAddress("glGenBuffersARB");
glBindBufferARB = (PFNGLBINDBUFFERARBPROC)wglGetProcAddress("glBindBufferARB");
glBufferDataARB = (PFNGLBUFFERDATAARBPROC)wglGetProcAddress("glBufferDataARB");
glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC)wglGetProcAddress("glBufferSubDataARB");
glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)wglGetProcAddress("glDeleteBuffersARB");
glGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC)wglGetProcAddress("glGetBufferParameterivARB");
glMapBufferARB = (PFNGLMAPBUFFERARBPROC)wglGetProcAddress("glMapBufferARB");
glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC)wglGetProcAddress("glUnmapBufferARB");
GLfloat vertices[] = .5, .5, .5, -.5, .5, .5, -.5,-.5, .5;
GLuint VBOID;
glGenBuffersARB(1, &VBOID);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, VBOID);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, 108, vertices, GL_STATIC_DRAW_ARB);
///Start loop
cout << "Starting" << endl;
while( window.isOpen() )
sf::Event event;
while( window.pollEvent( event ) )
if( event.type == sf::Event::Closed )
window.close();
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(50.0, 1.0, 1.0, 50);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(5, 5, 5, 0, 0, 0, 0, 1, 0);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, VBOID);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableClientState(GL_VERTEX_ARRAY);
///Reset env settings for SFML
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
window.display();
return 1;
编辑:
注释掉所有事件轮询不会改变任何事情。如果我使用 window.clear() 或 opengl 的 clear 函数,窗口清除似乎没有什么不同。
通过进一步注释,我发现一行代码 window.display() 导致了我的内存泄漏。我会看看 SFML 论坛上的人是否能解决这个问题;)
【问题讨论】:
【参考方案1】:我在你的绘制循环中看不到任何会导致这种行为的东西。
我认为你应该试试 SFML 论坛:http://en.sfml-dev.org/forums/
关于这个问题有几个线程:
http://en.sfml-dev.org/forums/index.php?topic=8609.0 http://en.sfml-dev.org/forums/index.php?topic=8092.0 http://en.sfml-dev.org/forums/index.php?topic=7146.0开发人员大多声称这是驱动程序问题。您可以尝试禁用所有绘制代码,看看是否有任何改变。改用 window.clear() 吗?移除事件轮询?
【讨论】:
以上是关于OpenGL VBO 内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章