我的程序使用Pyopengl(所以它是Python)与Psyco一起使用。

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

我想在某些情况下,可以将多个线段合并为一条大行,但老实说,我甚至都不知道从哪里开始。我确实具有存储的每行的起点和终点,因此可能会有所帮助。请注意,我只要在启动时就可以花费时间,并且内存使用量并不是太大的问题。

任何想法都将不胜感激。

有帮助吗?

解决方案

几乎可以肯定的是,所有即时模式函数呼叫的开销都在杀死您的性能。我会做以下。

不要使用 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可能会更快。

其他提示

20K段并不多。另外,当您每帧可以合并10-100行时,您将很幸运,因此通过这种优化的加速将被忽略。渲染过程可能很慢,因为您一次又一次地创建模型。利用 glNewList() 要将所有渲染命令保存在卡上的GL渲染列表中,然后就发布 glCallList() 用一个命令渲染它。

您可以定义一个错误度量标准,以将两个线段合并为一个线段,然后测试所有对段,然后如果错误低于某个阈值,则将其合并。

一个示例是该算法:

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

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

编辑1

绝对尝试在实现此内容之前尝试执行显示列表或顶点缓冲区对象渲染。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top