1

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

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

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

任何想法将不胜感激。

4

3 回答 3

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 可能会更快。

于 2009-12-21T08:58:30.137 回答
0

20K 段并不多。此外,当您每帧可以合并 10-100 行时,您会很幸运,因此这种优化带来的加速可以忽略不计。渲染过程可能很慢,因为您一次又一次地创建模型。用于glNewList()将所有渲染命令保存在卡上的 GL 渲染列表中,然后只需发出glCallList()一个命令即可对其进行渲染。

于 2009-12-21T08:34:42.137 回答
0

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

一个例子是这个算法:

  1. 从两条线段 A 和 B 中相距最远的两点构造一条新的线段 X。
  2. 求 A 和 B 中所有点到 X 的最小距离。
  3. 将误差分配为这些最小距离中的最大值。
  4. 如果错误低于您的阈值,则将 A 和 B 替换为 X。

这不是最好的算法,但很容易实现。

编辑 1

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

于 2009-12-21T08:40:33.823 回答