2012-10-21 64 views
0

我用一個非常簡單的OpenGL應用程序來學習VBOs,但內存出現問題。它使用的內存容易增加打開的時間。下面是代碼是什麼我使用Windows任務管理器中看到的重複:OpenGL VBO內存泄漏

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的清除函數,窗口清除似乎沒有什麼區別。

隨着進一步的評論,我能夠弄清楚,一行代碼window.display()正在導致我的內存泄漏。我看看在SFML論壇上的傢伙是否可以找出這個問題;)

回答

0

我看不到任何東西會在你的繪製循環中產生這種現象。

我想你應該嘗試的SFML論壇:http://en.sfml-dev.org/forums/

有關於這個問題的幾個線程:

開發商大多要求 這是一個驅動程序問題。你可以嘗試禁用所有的繪圖代碼,看看是否改變了任何東西。使用window.clear()來代替?刪除事件輪詢?