我开始为一个独立项目创建一个小型游戏引擎。在编写引擎的图形部分时,我注意到当我停止使用glClearColor和glPushMatrix / glPopMatrix对时,内存泄漏消失了。 从我研究过的情况来看,它似乎很常见,但我没有找到解释为什么会发生这种情况的答案。
奇怪的是,泄漏持续了一两分钟,然后停止(非常一致)。 使用任务管理器,当泄漏停止时显示11,012K。
附加说明:我没有使用GLUT,但是我使用GLEW_1.7来映射vbo。
任何可能导致这种情况的想法? 由于OpenGL在幕后做了一些奇怪的事情,这只是一个非问题吗?
这是我唯一称之为glClearColor,glPushMatrix和glPopMatrix的地方。
void GraphicsDevice::updateCameraAndClear(IWindow* window)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(32, window->getAspectRatio(), 0.0, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClearColor(100.0f / 255, 149.0f / 255, 237.0f / 255, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_CULL_FACE); // Enable Culling
glCullFace(GL_BACK);
glEnable(GL_NORMALIZE);
glEnable(GL_POLYGON_SMOOTH);
}
void Engine::draw(void)
{
GraphicsDevice::Instance()->updateCameraAndClear(_window);
if ( !_states.empty() )
{
for(std::vector<IState*>::iterator i = _states.begin(); i != _states.end(); i++)
{
glPushMatrix();
(*i)->draw(this);
glPopMatrix();
}
}
}
答案 0 :(得分:0)
也许你错误地使用推/弹对,比需要多一次额外的时间。但最终会导致缓冲区溢出..
检查您的推/弹对并确保确实是对。泄密也可能在周围的代码中。
编辑: OpenGL会收到说明,但不会立即执行。 OpenGL有自己的计划。如果您glDeleteTextures
无法保证纹理将被移除,直到glFinish
/ glFlush
命令(或甚至在?之后)。也许在你的Draw
代码中还有其他东西在OpenGL中保存在内存中。这与glPush / glPop对共同加入时给出了描述的效果。