我该怎么做才能优化我的jogl表现?

时间:2016-04-23 13:42:33

标签: algorithm performance jogl

我正在使用JFrame和OpenGL编写一个jogl程序来显示1500个旋转立方体(由六个方块绘制)。每个都有不同的大小,转速和方向。最大fps约为25.我认为它很慢。我还没有实现照明效果和其他东西。我的笔记本电脑是13英寸的Macbook air,几个月前购买了i7。这是我的代码供您参考。你能不能给我一些建议来改善我的节目表现?也欢迎不适合我的情况的建议。例如,哪种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();
        }

    }

}

1 个答案:

答案 0 :(得分:3)

  哪些gl或flu功能会降低我的电脑速度?我该怎么做   避免?或者,哪个可以替换?

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

glMatrixModeglLoadIdentityglTranslatedglRotated

特别是这些因为效率非常低:

glBeginglColor3dglVertex3dglEnd

基本上,你每次发送的数据非常少,而你的gpu在执行时却未得到充分利用,并且大部分时间都在停止等待数据。

要改变这种状况,你必须做一些事情,这可能会使你的速度提高几百倍。

对于所有矩阵操作,您可以使用jogl util FloatUtil或使用库,例如​​joml或我的jglm,然后将其上传到统一变量或统一缓冲对象(UBO)。

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

如果您暂时不需要任何GUI(例如awt,swt或swing),则可以使用高性能本机工具包Newt

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

然后,一旦你运行它,学习一些代码,以了解基础知识。然后开始在其上构建代码。

通过这种方式,一旦你应用了一个修改,你可以测试它是否有效,如果没有,你知道错误可能就在你的最后一次尝试中。

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