我的程序使用psyco的PyOpenGL(所以它是Python)。
我有大约21,000个线段,我需要在渲染的每个帧中渲染(除非用户放大,在这种情况下,线段被剔除而根本不会发送到卡上)。目前每帧需要大约1.5秒才能完成。这还不够好,所以我正在寻找减少不同线段数量的方法。
我想可能会出现多个线段可以合并成一个大线的情况,但老实说,我甚至不知道从哪里开始。我确实存储了每一行的起点和终点,这样可能会有所帮助。请注意,我可以在启动时使用我需要的时间,并且内存使用不是太大的问题。
非常感谢任何想法。
答案 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)
您可以定义一个错误指标,用于将两个线段合并为一个,然后测试所有段对,然后在错误低于某个阈值时合并它们。
这个算法就是一个例子:
这不是最好的算法,但很容易实现。
在实现之前,一定要尝试做显示列表或顶点缓冲区对象渲染。