我应该怎么做才能优化我的 jogl 性能?
What should I do to optimise my jogl performance?
我正在使用 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();
}
}
}
which gl or flu functions will slow down my computer? Which should I
avoid? Or, Which can be replaced?
您应该避免以下调用,因为已弃用:
glMatrixMode
、glLoadIdentity
、glTranslated
、glRotated
尤其是这些,因为它们也非常低效:
glBegin
、glColor3d
、glVertex3d
、glEnd
基本上你每次发送的数据很少,而你的 gpu 在执行时未得到充分利用,大部分时间都在等待数据。
要改变这一点,您必须做几件事,这可能会让您的速度提高一百倍。
对于所有的矩阵操作,可以使用jogl util FloatUtil
或者使用库,比如joml or my jglm,然后上传到统一变量或者统一缓冲对象(UBO ).
对于顶点和颜色,您应该使用顶点缓冲对象 (VBO)。基本上,您在开始时将所有数据打包在一起,将它们上传到 gpu,设置几个参数,然后启动渲染调用,直接从这个(这些)缓冲区获取数据。
如果您暂时不需要任何 GUI(例如 awt、swt 或 swing),您可以使用高性能原生工具包 Newt。
我建议你不要修改你的代码,而是从一个可靠的工作场景开始,比如我的一个 Hello Triangle(暂时使用 GL3,因为 GL4 需要 OpenGL 4.5 和 OSX 最多只能提供 4.1,所以你应该修改它,但目前不建议你这样做)。
然后一旦你得到它运行,研究一点代码以了解基础知识。然后开始在其上构建您的代码。
这样,一旦你应用了一个修改,你就可以测试它是否有效,如果没有,你就知道错误可能出在你最后一次尝试中。
如果您有任何问题,请随时寻求帮助:)
我正在使用 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();
}
}
}
which gl or flu functions will slow down my computer? Which should I avoid? Or, Which can be replaced?
您应该避免以下调用,因为已弃用:
glMatrixMode
、glLoadIdentity
、glTranslated
、glRotated
尤其是这些,因为它们也非常低效:
glBegin
、glColor3d
、glVertex3d
、glEnd
基本上你每次发送的数据很少,而你的 gpu 在执行时未得到充分利用,大部分时间都在等待数据。
要改变这一点,您必须做几件事,这可能会让您的速度提高一百倍。
对于所有的矩阵操作,可以使用jogl util FloatUtil
或者使用库,比如joml or my jglm,然后上传到统一变量或者统一缓冲对象(UBO ).
对于顶点和颜色,您应该使用顶点缓冲对象 (VBO)。基本上,您在开始时将所有数据打包在一起,将它们上传到 gpu,设置几个参数,然后启动渲染调用,直接从这个(这些)缓冲区获取数据。
如果您暂时不需要任何 GUI(例如 awt、swt 或 swing),您可以使用高性能原生工具包 Newt。
我建议你不要修改你的代码,而是从一个可靠的工作场景开始,比如我的一个 Hello Triangle(暂时使用 GL3,因为 GL4 需要 OpenGL 4.5 和 OSX 最多只能提供 4.1,所以你应该修改它,但目前不建议你这样做)。
然后一旦你得到它运行,研究一点代码以了解基础知识。然后开始在其上构建您的代码。
这样,一旦你应用了一个修改,你就可以测试它是否有效,如果没有,你就知道错误可能出在你最后一次尝试中。
如果您有任何问题,请随时寻求帮助:)