在OpenGL中管理大量行的最有效方法是什么?

时间:2008-12-01 21:25:48

标签: opengl performance conceptual

我正在开发一个简单的CAD程序,它使用OpenGL来处理屏幕渲染。屏幕上绘制的每个形状完全由简单的线段构成,因此即使是简单的绘图最终也会处理数千条单独的线条。

在我的应用程序和OpenGL之间传递此行集合中的更改的最佳方法是什么?有没有办法只更新OpenGL缓冲区中某些行的子集?

我在这里寻找一个概念性的答案。无需深入了解实际的源代码,只需要对数据结构和通信提出一些建议。

4 个答案:

答案 0 :(得分:8)

您可以使用一种简单的方法,例如使用显示列表(glNewList / glEndList)

另一个稍微复杂的选项是使用顶点缓冲对象(VBO - GL_ARB_vertex_buffer_object)。它们的优点是可以动态更改它们,而显示列表则不能。

这些基本上批量处理所有数据/转换并在GPU上执行(假设您正在使用硬件加速),从而提高性能。

答案 1 :(得分:7)

顶点缓冲区对象可能就是你想要的。加载原始数据集后,您可以使用glBufferSubData()修改现有块。

如果添加额外的线段并溢出缓冲区的大小,你当然必须创建一个新缓冲区,但这与在某些东西增长时必须在C中分配一个新的,更大的内存块没什么不同。

编辑:显示列表上的几个注释,以及为什么不使用它们:

  1. 在OpenGL 3.0中,不推荐使用显示列表,因此使用它们不能在3.0之前向前兼容(当然,2.1实现将会存​​在一段时间,因此根据您的目标受众,这可能不是问题)< / LI>
  2. 每当您更改任何内容时,您必须重建整个显示列表,如果经常更改内容,则会失去显示列表的整个目的。

答案 2 :(得分:2)

不确定您是否已经这样做了,但值得一提的是,如果可能的话,您应该尝试使用GL_LINE_STRIP而不是单独的GL_LINES来减少发送到卡上的顶点数据量。

答案 3 :(得分:2)

我的建议是尝试使用场景图,线条/曲线的某种分层数据结构。如果您有大型模型,如果您有简单的行列表,性能将受到影响。使用图形/树结构,您可以轻松检查哪些项目可见,哪些项目不使用边界卷。使用场景图,您可以轻松应用转换并重用几何图形。