当屏幕上有很多东西时,Opengl会减慢速度
Opengl slows down when a lot of stuff is on the screen
所以我今天刚开始从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()
。
编辑:
也很抱歉没有提供足够的信息,我想我认为问题会很明显。我对自己有多自信啊?哈哈。
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 了解 GLM- openGL 中的相机转换
- 如何在全屏模式下(在OpenGL中)使背景透明
- OpenGL 更新缓冲区如何影响速度
- OpenGL 计算着色器分离循环的速度更快
- Qt 4/5与opengl API在opengl速度上的差异
- 球体碰撞算法总体速度保持递增(C++,OpenGL)
- 如何在Opengl窗口上加快与Cairo的绘图速度
- OpenGL对象在PC上以正常速度旋转,但在笔记本电脑上非常快
- 使用Opengl绘制50k以上球体时如何提高速度
- 当屏幕上有很多东西时,Opengl会减慢速度
- OpenGL可编程管道运行速度较慢
- 每次移动(速度)时刷新显示(openGL)
- 函数使用C++/OpenGL/Glut在屏幕上绘制文本的速度比glutBitmapCharacter快
- 可以将OpenGL用于我的QGraphicsItems加快在QGraphicsView中的显示速度
- 本机C++OpenGL到托管C++到Winform C#-调试过程中速度较慢
- Qt OpenGL更新速度太慢
- OpenGL+ffmpeg在全屏模式下速度较慢
- SFML绘制OpenGL到多个窗口的速度非常慢
- 在速度/效率方面,Allegro vs OpenGL