当屏幕上有很多东西时,Opengl会变慢

时间:2012-02-15 22:08:51

标签: c++ opengl sdl

所以我今天刚刚开始从SDL切换到OpenGL,而且我遇到了这个问题,当我使用SDL时,我没有这个问题。

当屏幕上出现很多东西时,整个事情就变成了慢动作。当我说很多时我指的是200多个物体,但可能从50开始变得明显。

这就是呈现内容的方式,我有一个class Renderable virtual void render()RenderManager在循环void manage()中调用render()调用Renderable对于屏幕上的每个glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); _renderManager.manage(); glFlush(); SDL_GL_SwapBuffers();

主循环看起来像这样

render()
对于我使用的对象,

glBegin(GL_QUADS); // Draw square with colors glEnd(); 只是正方形,所以

{{1}}

我的CPU使用率或内存使用量似乎并不高,它就像...游戏正在放缓。

2 个答案:

答案 0 :(得分:1)

我想问题是你正在使用立即模式,如果遇到性能问题,你应该使用Vertex Arrays。

我们不知道您的所有代码,因此很难给出完整的答案,但使用顶点数组肯定是第一步,如果事情进展缓慢,应该确保。

看看这里:http://www.songho.ca/opengl/gl_vertexarray.html

基本上事实是,使用glBegin ... glEnd最终会对GPU进行多次调用,而使用顶点数组预先计算形状,将它们保存在缓冲区中并直接绘制它们电话数量很大。

答案 1 :(得分:0)

对不起,我从来没有使用OpenGL,我真的不知道我在做什么,但我找到了一个解决方案(现在正在努力!)。也谢谢杰克你的回答!我现在肯定使用顶点数组,我发现不推荐使用glBegin()和glEnd()。我甚至可以尝试顶点缓冲对象。

问题是当Renderable为每个RenderManager每个循环调用render()时,每个人Renderable都在调用glBegin()和glEnd()。这会给GPU带来很大的压力。

在撰写此答案时,我的sendVertices(GLfloat vertices[]);中有一个RenderManager,它将所有顶点添加到std::vector<GLfloat>。在RenderManager的循环期间,我创建了一个顶点指针

glVertexPointer(2, GL_FLOAT, 0, &vertices[0]);

然后致电

glDrawArrays(GL_QUADS, 0, vertices.size() / 2);

因此,它不是为每个对象渲染,而是根据顶点一次渲染所有内容。现在我开始看到800多个物体放慢速度。虽然不是很好,但我还有很多工作要做。因为现在每个循环都重新创建vertices向量而不是修改。这也不考虑颜色,但我走在正确的轨道上!

最初切换到顶点数组并没有太大的区别,因为它仍然为每个单独的对象进行渲染,因此为200 + glDrawArrays()中的每一个调用了Renderable。 / p>

编辑:

也很抱歉没有提供足够的信息,我想我认为这个问题很明显。我对自己有什么信心,对吧?哈哈。