代码之家  ›  专栏  ›  技术社区  ›  Mike Bailey

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

  •  4
  • Mike Bailey  · 技术社区  · 15 年前

    我现在正在写一个交互式模拟器,它显示粒子系统的演化。我正在Windows7上开发32位,使用VisualStudio。

    目前,我有一个函数来绘制屏幕上的所有粒子,看起来像这样:

    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帧/秒。但是如果我使用1000个粒子,这个速度只有15-20帧/秒。

    3 回复  |  直到 14 年前
        1
  •  9
  •   Dr. Snoopy    15 年前

    您应该做的第一个优化是删除glBegin/glEnd(立即模式)并移动到顶点数组(VAs)和顶点缓冲区对象(VBOs)。

    您可能还希望查看点精灵以绘制粒子。

        2
  •  1
  •   matt    15 年前

    改用直接X。

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

    但是,其他人说的是:

    -使用数组/元素

    -使用顶点缓冲区

    -您可以创建一个顶点着色器,这样就不必在每帧更新整个顶点缓冲区(您只需存储初始设置,如init pos、init velocity、init time,然后是常量gravity,然后着色器就可以基于单个更新的全局常量“current time”计算每帧的当前位置)

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

        3
  •  0
  •   Jerry Coffin    15 年前

    速度上的差异(基本上,在打开它的情况下,您可以获得大量的软件渲染)。

    glDrawArrays glDrawElements (在众多的可能性中,只有一对)。