2012-02-15 80 views
-1

因此,我刚刚开始从SDL切换到OpenGL,而我遇到了使用SDL时没有的问题。当屏幕上出现很多东西时,Opengl速度变慢

当屏幕上有很多东西时,整个事情就会变成慢动作。当我说了很多我的意思是200个+对象,但开始出现明显的也许从50

这是事情是如何呈现的,我有一个virtual void render()一个class Renderable这是由RenderManager在一个循环void manage()叫其在屏幕上每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使用率或内存使用率似乎并不高总之,这就像......游戏正在减速。

+0

您将需要缩小范围或提供更多代码或其他内容,因为这里没有任何内容可以继续。 – 2012-02-15 22:49:30

+0

您是否尝试过对各个组件进行计时,以了解花费最多时间的是什么? – cmannett85 2012-02-16 07:19:29

回答

1

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

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

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

基本事实是,与glBegin ... glEnd你最终会做很多电话给GPU而与顶点数组你预先计算你的形状,你将它们保存在缓冲区和直接吸引他们减少大量的通话次数。

+0

这并没有解决问题。 – SpaceFace 2012-02-15 22:24:04

+6

然后你应该提供更多的东西,否则我们根本无法提供帮助。你是如何在10分钟内从立即切换到顶点数组的? :) – Jack 2012-02-15 22:25:09

+0

事实是没有更多的展示。就像现在一样简单,在屏幕上绘制大量的矩形。那里的代码是现在唯一被调用的与opengl相关的代码。我从来没有使用过opengl,有没有我在这里失踪的步骤?这就是为什么它没有时间切换到顶点数组。 – SpaceFace 2012-02-15 22:32:56

0

对不起,我从来没有使用OpenGL,我真的不知道我在做什么,但我找到了一个解决方案(现在正在处理它!)。也谢谢杰克为你解答!我现在肯定在使用顶点数组,我发现glBegin()和glEnd()已被弃用。我甚至可能会尝试顶点缓冲区对象。

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

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

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

然后调用

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

因此,而不是渲染为每个对象在一次基于顶点它呈现的一切。现在我开始看到在800多个物体上放慢速度。虽然不是很好,但仍有很多工作要做。因为现在每个循环都会重新创建矢量而不是修改。此外,这不涉及颜色,但我在正确的轨道上!

最初切换到顶点数组并没有太大区别,因为它仍然针对每个单独的对象进行渲染,所以对于每个200+ Renderable都调用glDrawArrays()

编辑:

也对不起没有给予足够的信息,我想我认为这个问题是显而易见的。我对自己有什么信心,是吧?哈哈。