繁体   English   中英

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

[英]How can I efficiently draw thousands of vertices?

我目前正在编写一个交互式模拟器,它显示了粒子系统的演变。 我正在使用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左右。

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

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

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

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

请改用Direct X.

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

因此,如果ALL ELSE失败,您可以尝试使用DirectX。

但是,是的,其他人说的话:

- 使用DrawArrays / Elements

- 使用顶点缓冲区

- 使用点精灵

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

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

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

其次,虽然我怀疑你需要,但你可以切换到使用glDrawArraysglDrawElements (仅限于许多可能性中的一对)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM