如何有效地绘制数千个顶点?

时间:2010-09-21 01:49:58

标签: c++ performance opengl 3d

我目前正在编写一个交互式模拟器,它显示了粒子系统的演变。我正在使用Visual Studio在Windows 7 32位上进行开发。

目前,我有一个功能可以在屏幕上绘制看起来像这样的所有粒子:

void Simulator::draw()
{
    glColor4f(255, 255, 255, 0);
    glBegin();
    for (size_t i = 0; i < numParticles; i++)
        glVertex3dv(p[i].pos);
    glEnd();       
}

这很有效,而且全部用于测试,但它的速度非常慢。如果我在屏幕上有200个粒子,没有做任何其他计算(只是重复调用draw()),我得到大约60 fps。但是,如果我使用1000个粒子,它的运行速度只有15 - 20 fps。

我的问题是:如何更快地绘制粒子?我的模拟以相当不错的速度运行,并且在某一点上它实际上被图画阻止(!)。

3 个答案:

答案 0 :(得分:9)

你应该做的第一个优化是放弃glBegin / glEnd(立即模式)并移动到顶点阵列(VA)和顶点缓冲对象(VBO)。

您可能还想查看Point Sprites来绘制粒子。

答案 1 :(得分:1)

这将不受欢迎,我知道我讨厌它:

改用Direct X.

微软自Vista以来一直试图杀掉openGL。 所以他们很可能会让你的生活变得困难。

所以如果ALL ELSE失败,你可以尝试使用DirectX。

但是,其他人说过的话:

- 使用DrawArrays / Elements

- 使用顶点缓冲区

- 使用点精灵

- 你可以创建一个顶点着色器,这样你就不必每帧都更新整个顶点缓冲区(你只需存储初始设置,如init pos,初始速度,初始化时间,然后是恒定重力,然后着色器可以计算每帧的当前位置基于单个更新的全局常量“当前时间”)

- 如果它是打开GL中的设置(就像在directX中一样),请确保使用硬件顶点处理)

答案 2 :(得分:0)

首先,如果您还没有这样做,请禁用桌面窗口管理器 - 它可以在速度上产生巨大的差异(您基本上可以通过打开软件渲染)。

其次,虽然我怀疑你是否需要,但你可以转而使用glDrawArraysglDrawElements(对于许多可能性中的一对)。