我正在使用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();
}
}
}
答案 0 :(得分:3)
哪些gl或flu功能会降低我的电脑速度?我该怎么做 避免?或者,哪个可以替换?
您应该避免以下调用,因为已弃用:
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,所以你应该修改它,但目前不建议你这样做。)
然后,一旦你运行它,学习一些代码,以了解基础知识。然后开始在其上构建代码。
通过这种方式,一旦你应用了一个修改,你可以测试它是否有效,如果没有,你知道错误可能就在你的最后一次尝试中。
如果您有任何问题,请随时寻求帮助:)