在单个开始-结束块中绘制多个OpenGL点的有效方法?

在单个开始-结束块中绘制多个OpenGL点的有效方法?,opengl,rendering,points,Opengl,Rendering,Points,如果开始渲染点,渲染大量顶点,然后结束,则性能明显优于开始点,渲染顶点,结束并重复大量次数(例如,在平移和缩放操作期间,200000点的重画要平滑得多) 我想这可能有道理,但令人失望。是否有一种方法可以恢复性能,同时仍在其各自的开始-结束块中渲染每个点 背景: 我想设计一个控件,在每个对象都有自己的渲染的极端情况下,它可以包含超过一百万吨的对象。其中许多对象将自己表示为点 如果我让十万个点分别在它们自己的开始-结束块中渲染它们自己,我会获得一个主要的性能影响,而不是在单个开始-结束块中渲染它们。

如果开始渲染点,渲染大量顶点,然后结束,则性能明显优于开始点,渲染顶点,结束并重复大量次数(例如,在平移和缩放操作期间,200000点的重画要平滑得多)

我想这可能有道理,但令人失望。是否有一种方法可以恢复性能,同时仍在其各自的开始-结束块中渲染每个点

背景:

我想设计一个控件,在每个对象都有自己的渲染的极端情况下,它可以包含超过一百万吨的对象。其中许多对象将自己表示为点

如果我让十万个点分别在它们自己的开始-结束块中渲染它们自己,我会获得一个主要的性能影响,而不是在单个开始-结束块中渲染它们。因此,我可能需要让容器知道对象渲染自己的方式,例如,开始点,告诉需要渲染点的所有内容,然后结束

这打乱了我想要的显示对象关系的独立性。它还搞砸了按选择进行命中测试,因为我不认为可以在点的开始-结束块中向顶点添加名称,对吗


仅供参考,如果这有助于我的项目将使用正交投影显示2D场景,并且需要点击测试来确定用户可能点击的相关对象。通常,对象将表示包含与直线连接的单个点的轨迹。位置数据通常是静态的,但点和轨迹颜色以及显示模式可能会因用户设置和选择信息而更改。一个例外情况是,回放模式可能允许用户一次只能看到一个轨迹点,即回放中的当前点,以及从一个点到下一个点的逐步时间。然而,即使在这种情况下,我也假设我只需根据回放中的当前时间更改每个轨迹上的哪个点实际显示在其静态位置。如果这让我想起了对OpenGL新手的进一步建议,那么非常感谢

为了解决这个问题,我从使用VBOs开始,它确实加快了速度。然后,我允许我的轨迹对象使用两个DrawArray(一个用于线条带,一个用于点)绘制各自的点集以及连接每个轨迹点的线。每一点都不必独立于其他点,这是主要的性能改进

但是,我仍然需要针对分数进行命中测试,所以

最后,我需要允许每个显示的对象(在本例中是轨迹)执行自己的选择例程,以便每个对象都可以执行高效选择所需的操作。对于轨道,他们采取了两步流程。首先,轨迹使用一个名称0命名其整个线条带,并执行选择。如果这会导致命中,则轨迹将执行第二次渲染过程,命名每个单独的点和线段,以针对轨迹的每个部分进行命中测试。这使得针对每个点的命中测试相当快


另外,我正在使用.NETC进行编程。使用它,我创建了一个从EventArgs派生的SelectEventArgs类,用于描述显示对象的选择条件。我的SelectEventArgs类包含一个列表,用于填充选定对象。然后,display类有一个EventHandler事件。将对象添加到显示时,它订阅该事件。当事件激发时,每个对象确定是否已选定,并用其信息填充事件中传递的SelectEventArgs中选定对象的列表。触发事件后,我可以访问SelectEventArgs实例中返回的对象列表,以处理用户交互。我发现这是一种创建灵活的显示对象和选择工具的好模式。

如果您想要获得真正好的性能,就无法绕过巧妙的数据组织和批处理。它不必变成一团混乱,但它确实需要思考。除此之外,如果你能而且我怀疑你不能的话,你真的应该使用VBOs,不仅仅是为了性能,还因为它更好,更适合未来,并且可以很好地扩展到更复杂的东西。谢谢你的评论。我已经开始研究VBO了,目前我的原型使用的是显示列表,还需要阅读一些内容才能完全了解它们。我不认为他们一定会把我带到我想去的地方我假设每个VBO中的一组顶点不会像一个有一组顶点的VBO那样有效率,但是我正在努力学习我能做的,以确保我不会沿着错误的设计路径运行,然后才发现哦,你可以这样做吗?我将在问题中添加更多关于我的情况的信息,以防对建议有所帮助。