2

I am working on a part of a program where given a collection of xyz-coordinates, a 3D model is made. I have all of the functionality needed for this picture done (i.e. panning, rotating, scaling) however the more xyz-coordinates given, the slower my program runs. My program runs pretty smooth when processing 29,000 coordinates, but I when I have 300,000 points, my program slows down. I am using SharpGL in order to use OpenGL in WPF. The code for inserting all these points looks as follows:

gl.Begin(OpenGL.GL_LINES);

        for (int i = 0; i < (parser.dataSet.Count - 1); i++)
        {

            gl.Color(1.0f, 0.0f, 0.0f);
            gl.Vertex(parser.dataSet[i].X / parser.xDiv, parser.dataSet[i].Y / parser.yDiv, parser.dataSet[i].Z);
            gl.Vertex(parser.dataSet[i + 1].X / parser.xDiv, parser.dataSet[i + 1].Y / parser.yDiv, parser.dataSet[i + 1].Z);
        }

        gl.End();
        gl.Flush();

Am I doing something noobish (im not familiar with OpenGL) that I can fix? Some people have mentioned scaling my data down, which I am not totally opposed to, but is there a way to 'scale back up' as I "zoom"(rescale) in on the picture?

4

3 回答 3

7

300,000 个点的即时模式 ( glBegin()/ glEnd()) 函数调用开销是巨大的

使用顶点数组或顶点缓冲区对象批量提交几何图形。这样你就可以在 10 到 20 次电话中获得所有分数,而不是接近一百万。

于 2014-03-05T21:11:10.740 回答
1

只添加一粒盐,您可以优化划分:

divParserDotxDiv=1.0f/parser.xDiv;
divParserDotyDiv=1.0f/parser.yDiv;
gl.Color(1.0f, 0.0f, 0.0f);
for (int i = 0; i < (parser.dataSet.Count - 1); i++)
        {


            gl.Vertex(parser.dataSet[i].X * divParserDotxDiv, 
                      parser.dataSet[i].Y * divParserDotyDiv, 
                      parser.dataSet[i].Z);
            gl.Vertex(parser.dataSet[i + 1].X  * divParserDotxDiv,
                      parser.dataSet[i + 1].Y * divParserDotyDiv, 
                      parser.dataSet[i + 1].Z);
        }

这应该至少快 %1 到 %3 :)

于 2014-08-17T13:00:18.423 回答
0

genpfault 对“使用顶点缓冲区”的回答是正确的答案,但值得注意的是,如果您受到目标环境的限制和/或无法处理远离 OpenGL 1.x API 的端口,则可以在显示列表

使用显示列表,您可以创建并激活列表对象(使用glGenListsand glNewList),它本质上充当顶点调用的记录器。激活列表后,您可以像往常一样调用渲染调用(glBeginglEndglVertex等)。完成几何图形后,调用glEndList,完成记录。将来,当您想要渲染相同的几何图形时,您可以简单地调用glCallList快捷方式。因为列表数据可以被驱动程序捕获并存储在显卡上,所以开销要小得多。

但是,使用显示列表有一些注意事项。有一整套 OpenGL 函数不能从列表中调用,它们仅适用于静态几何。此外,不能保证驱动程序实际上会将信息存储在视频卡上,这意味着性能不一定有很大的提升。您最好的选择是从立即模式和固定功能管道迁移。

于 2014-03-05T21:51:58.080 回答