合并多个线段

时间:2009-12-21 08:16:45

标签: python opengl merge pyopengl line-segment

我的程序使用psyco的PyOpenGL(所以它是Python)。

我有大约21,000个线段,我需要在渲染的每个帧中渲染(除非用户放大,在这种情况下,线段被剔除而根本不会发送到卡上)。目前每帧需要大约1.5秒才能完成。这还不够好,所以我正在寻找减少不同线段数量的方法。

我想可能会出现多个线段可以合并成一个大线的情况,但老实说,我甚至不知道从哪里开始。我确实存储了每一行的起点和终点,这样可能会有所帮助。请注意,我可以在启动时使用我需要的时间,并且内存使用不是太大的问题。

非常感谢任何想法。

3 个答案:

答案 0 :(得分:4)

几乎可以肯定的是,所有立即模式函数调用的开销都会影响您的性能。我会做以下几点。

请勿使用GL_LINE_STRIPS,请使用单个GL_LINES列表,以便一次性呈现。

使用glDrawArrays代替立即模式渲染:

float* coordinates = {....}; //x and y coordinate pairs for all line segments
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 2 * sizeof(float), coordinates);
glDrawArrays(GL_LINES, 0, 2 * linecount);
glDisableClientState(GL_VERTEX_ARRAY);

(为了获得更好的性能,你可以将顶点缓冲区存储在一个称为顶点缓冲区对象的东西中,但这应该没问题)

最后一件事,如果你在每行基础上进行剔除,那么跳过它并将所有线路发送到GPU可能会更快。

答案 1 :(得分:0)

20K细分并不是那么多。此外,如果每帧可以合并10-100行,那么你会很幸运,因此这种优化的加速可以忽略不计。渲染过程可能很慢,因为您反复创建模型。使用glNewList()将所有渲染命令保存在卡上的GL渲染列表中,然后发出glCallList()以使用单个命令渲染它。

答案 2 :(得分:0)

您可以定义一个错误指标,用于将两个线段合并为一个,然后测试所有段对,然后在错误低于某个阈值时合并它们。

这个算法就是一个例子:

  1. 从两个线段A和B中最远的两个点构造一个新的线段X.
  2. 找到A和B中所有点与X的最小距离。
  3. 将错误指定为最小距离。
  4. 如果错误低于您的阈值,则将A和B替换为X.
  5. 这不是最好的算法,但很容易实现。

    编辑1

    在实现之前,一定要尝试做显示列表或顶点缓冲区对象渲染。