所以我今天刚刚开始从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使用率或内存使用量似乎并不高,它就像...游戏正在放缓。
答案 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>
编辑:
也很抱歉没有提供足够的信息,我想我认为这个问题很明显。我对自己有什么信心,对吧?哈哈。