我正在使用 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或者我的 jglm ,然后将其上传到统一变量或统一缓冲区对象(UBO)。
对于顶点和颜色,您应该使用顶点缓冲对象 (VBO)。基本上,您在开始时将所有数据打包在一起,将它们上传到 gpu,设置几个参数,然后启动渲染调用,直接从这个(这些)缓冲区获取数据。
如果您暂时不需要任何 GUI(例如 awt、swt 或 swing),您可以使用高性能原生工具包 Newt .
我建议您不要修改代码,而是从一个可靠且有效的场景开始,例如我的一个 Hello Triangle (暂时以 GL3 为例,因为 GL4 需要 OpenGL 4.5,而 OSX 最多只能提供 4.1,因此您应该修改它,但目前不建议您这样做)。
然后,一旦你开始运行它,研究一下代码以了解基础知识。然后开始在其上构建您的代码。
这样,一旦你应用了一个修改,你就可以测试它是否有效,如果没有,你就知道错误可能出在你最后一次尝试中。
如果您有任何问题,请随时寻求帮助:)
关于algorithm - 我应该怎么做才能优化我的 jogl 性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36811589/