当屏幕上有很多东西时,Opengl会减慢速度

Opengl slows down when a lot of stuff is on the screen

本文关键字:Opengl 速度 屏幕      更新时间:2023-10-16

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

当屏幕上有很多东西时,整个画面就会进入慢动作。当我说很多的时候,我指的是200多个物体,但可能从50个开始就开始引人注目了。

这就是事物的呈现方式,我有一个class Renderable和一个virtual void render(),它由循环void manage()中的RenderManager调用,该循环为屏幕上的每个Renderable调用render()

主循环看起来像这个

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();

我的CPU使用率或内存使用率似乎一点也不高,就像。。。比赛正在放缓。

我想问题是你使用的是即时模式,如果你有性能问题,你应该使用顶点阵列。

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

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

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

对不起,我从未使用过OpenGL,我真的不知道自己在做什么,但我找到了一个解决方案(现在正在研究它!)。也感谢杰克的回答!我现在肯定在使用顶点数组,我发现glBegin()和glEnd()是不推荐使用的。我甚至可以尝试顶点缓冲区对象。

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

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

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

然后呼叫

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

因此,它不是对每个对象进行渲染,而是基于顶点同时渲染所有对象。现在我开始看到800多个物体的速度变慢了。虽然不太好,但我还有很多工作要做。因为现在vertices向量是在每个循环中重新创建的,而不是修改的。这也不考虑颜色,但我走在正确的轨道上!

最初切换到顶点阵列并没有太大区别,因为它仍在为每个单独的对象进行渲染,因此为200+Renderable中的每个对象调用glDrawArrays()

编辑:

也很抱歉没有提供足够的信息,我想我认为问题会很明显。我对自己有多自信啊?哈哈。