我目前正在编写一个交互式模拟器,它显示了粒子系统的演变。我正在使用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。
我的问题是:如何更快地绘制粒子?我的模拟以相当不错的速度运行,并且在某一点上它实际上被图画阻止(!)。
答案 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)
首先,如果您还没有这样做,请禁用桌面窗口管理器 - 它可以在速度上产生巨大的差异(您基本上可以通过打开软件渲染)。
其次,虽然我怀疑你是否需要,但你可以转而使用glDrawArrays
或glDrawElements
(对于许多可能性中的一对)。