Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在OpenGL中管理大量行的最有效方法是什么?_Opengl_Performance_Conceptual - Fatal编程技术网

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

在OpenGL中管理大量行的最有效方法是什么?,opengl,performance,conceptual,Opengl,Performance,Conceptual,我正在开发一个简单的CAD程序,它使用OpenGL处理屏幕渲染。屏幕上绘制的每个形状都完全由简单的线段构成,因此即使是一个简单的图形也会处理数千条单独的线条 在我的应用程序和OpenGL之间,传递这一行集合中的更改的最佳方式是什么?有没有办法只更新OpenGL缓冲区中某一行的子集 我在这里寻找一个概念性的答案。不需要深入实际的源代码,只需要一些关于数据结构和通信的建议。您可以使用一种简单的方法,例如使用显示列表(glNewList/glEndList) 另一个稍微复杂一点的选项是使用顶点缓冲区对

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

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


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

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

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


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

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

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

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

  • 在OpenGL 3.0中,不推荐使用显示列表,因此在3.0之后使用它们是不向前兼容的(当然,2.1的实现将持续一段时间,因此根据您的目标受众,这可能不是问题)
  • 无论何时更改任何内容,都必须重新生成整个显示列表,如果内容经常更改,则无法实现显示列表的全部目的

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

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