【问题标题】:What should I do to optimise my jogl performance?我应该怎么做才能优化我的慢跑表现?
【发布时间】:2016-04-23 13:42:32
【问题描述】:

我正在使用 JFrame 和 OpenGL 编写一个 jogl 程序来显示 1500 个旋转立方体(由六个正方形绘制)。每个都有不同的尺寸、旋转速度和方向。最大fps约为25。我认为它很慢。我还没有实现灯光效果和其他东西。我的笔记本电脑是几个月前购买的带有 i7 的 13 英寸 Macbook air。这是我的代码供您参考。你能给我一些建议来提高我的程序的性能吗?不适合我情况的建议也受到欢迎。例如,哪些 gl 或 flu 功能会降低我的计算机速度?我应该避免哪个?或者,哪个可以更换?最后,我如何检查程序的整体性能以及如何知道我的程序已优化?

    public void draw(GLAutoDrawable drawable) { // this is a method called in the display method.

    GL2 gl = drawable.getGL().getGL2();
    gl.glMatrixMode(GL2.GL_MODELVIEW);      
    if ( Constants.p == null ) return;
    for ( Primitives p : Constants.p ) { //Constants is a class that holds all the global variables

        gl.glLoadIdentity();
        gl.glTranslated(p.centerPoint.x,p.centerPoint.y, p.centerPoint.z);
        gl.glRotated(p.angle, p.direction.x, p.direction.y, p.direction.z);p.angle += p.speed;p.angle = p.angle % 360;


        if ( Constants.modes == 0 ) { //draw using lines
            gl.glBegin (GL2.GL_LINES);//static field

                    for ( Integer[] l : p.line ) {

                        gl.glColor3d(p.color.get(l[0]).x,p.color.get(l[0]).y,p.color.get(l[0]).z);
                        gl.glVertex3d( p.vert.get(l[0]).x, p.vert.get(l[0]).y, p.vert.get(l[0]).z);
                        gl.glColor3d(p.color.get(l[1]).x,p.color.get(l[1]).y,p.color.get(l[1]).z);
                        gl.glVertex3d( p.vert.get(l[1]).x, p.vert.get(l[1]).y, p.vert.get(l[1]).z);
                    }

            gl.glEnd();
        } else if ( Constants.modes == 1 ) { //draw using squares
            gl.glBegin (GL2.GL_QUADS);//static field

            for ( Integer[] f : p.face ) {

                for ( Integer l : f ) {

                    for ( Integer i : p.line.get(l) ) {

                        gl.glColor3d(p.color.get(i).x,p.color.get(i).y,p.color.get(i).z);
                        gl.glVertex3d( p.vert.get(i).x, p.vert.get(i).y, p.vert.get(i).z);

                    }

                }
            }

            gl.glEnd();
        }

    }

}

【问题讨论】:

  • 也考虑网格实例化:opengl.org/sdk/docs/man/html/glDrawElementsInstanced.xhtml 您可以使用平截头体剔除、贡献剔除、门户剔除……我大多同意选择但基于 JOGL 的更高级别的解决方案可能适合您的需求,即框架或引擎,如 LibGDX、JMonkeyEngine、JogAmp 的 Ardor3D Continuation(我维护它),...
  • 请提供 SSCCE:sscce.org 这将帮助我们确定要优化的内容。即使针对低端硬件,也不要使用立即渲染,它效率低下。

标签: algorithm performance jogl


【解决方案1】:

哪些 gl 或 flu 功能会降低我的计算机速度?我应该哪个 避免?或者,哪个可以替换?

您应该避免以下调用,因为已弃用:

glMatrixMode, glLoadIdentity, glTranslated, glRotated

尤其是这些,因为它们也非常低效:

glBegin、glColor3d、glVertex3d、glEnd

本质上,您每次发送的数据很少,而您的 gpu 在执行时大大未得到充分利用,并且大部分时间都在等待数据。

要改变这一点,你必须做几件事,这可能会给你带来甚至快上百倍的提升。

对于所有的矩阵运算,可以使用jogl utilFloatUtil或者使用库,比如joml或者我的jglm,然后上传到统一变量或者统一缓冲区对象(UBO) .

对于顶点和颜色,您应该使用顶点缓冲区对象 (VBO)。基本上,您在开始时将所有数据打包在一起,将它们上传到 gpu,设置几个参数,然后启动渲染调用,该调用将直接从这个(这些)缓冲区获取数据。

如果你暂时不需要任何GUI(如awt、swt或swing),可以使用高性能原生工具包Newt。

我建议您不要修改您的代码,而是从一个可靠的工作场景开始,例如我的Hello Triangle 之一(暂时使用 GL3,因为 GL4 需要 OpenGL 4.5 而 OSX 只提供最高 4.1,所以你应该修改它,但目前不建议你这样做)。

然后,一旦你让它运行起来,研究一下代码以了解基础知识。然后开始在它之上构建你的代码。

这样,一旦你应用了修改,你就可以测试它是否有效,如果没有,你就知道错误可能在于你最后一次尝试。

如果您有任何问题,请随时寻求帮助:)

【讨论】:

  • 谢谢!这很有用。看来我必须学习一套全新的方法来构建我的程序 T_T。
  • 是的,但是一旦你完成了,你就会真正知道图形管道中发生了什么,你将获得完全的控制权:)
  • Ps:对于矩阵,你也可以使用 jogl FloatUtil
猜你喜欢
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多