Hallo Forum,
ich beschäftige mich gerade etwas mit JOGL, aber das könnte grundsätzlich auch eine allgemeine OpenGL Frage sein:
In einem Model werden ca. 10.000 'Entities' dargestellt, die lediglich als graue Boxen dargestellt werden. Shading, Texturen u.Ä. kommen nicht zur Anwendung. Die Boxen werden in der Animation zwar bewegt, aber ihre Form ändert sich nicht. Die Boxen werden daher in Display-Listen hinterlegt.
Für eine solche Entity sieht der Render-Code, der dann initial in eine Display-List abgelegt wird, wie folgt aus:
Im eigentlich Render-Vorgang (aufgerufen von display) werden dann die Display-Listen nur noch ausgeführt, vorher wird die Matrix um die aktuelle Position der Entity translatiert:
Damit komme aich in etwas auf gerade einmal 30 FPS und ein Mikro-Benchmark zeigt, dass das Ausführen der display Methode ca. 33 ms benötigt von denen nicht einmal 1 ms auf die Methode renderCamera() fällt. Und das auf einen gar nicht mal so alten Gurke... Vielleicht irre ich mich (und der rechner hier ist eine Gurke), aber mir scheint das es da noch optimierungsbedarf gibt. Daher die Frage, ob mir vielleicht jemand einen Tipp geben, wo dieser Code optimiert werden kann.
PS: GL_CULL_FACE ist aktiviert und die glut-Funktion gluSolidCube liefert deutlich schlechtere Ergebnisse.
Vielen Dank im voraus!
ich beschäftige mich gerade etwas mit JOGL, aber das könnte grundsätzlich auch eine allgemeine OpenGL Frage sein:
In einem Model werden ca. 10.000 'Entities' dargestellt, die lediglich als graue Boxen dargestellt werden. Shading, Texturen u.Ä. kommen nicht zur Anwendung. Die Boxen werden in der Animation zwar bewegt, aber ihre Form ändert sich nicht. Die Boxen werden daher in Display-Listen hinterlegt.
Für eine solche Entity sieht der Render-Code, der dann initial in eine Display-List abgelegt wird, wie folgt aus:
Java:
public static void renderEntity(GL2 gl) {
gl.glBegin(GL2.GL_QUADS);
gl.glVertex3f(-sizex / 2f, -sizey / 2f, -sizez / 2f);
gl.glVertex3f(-sizex / 2f, +sizey / 2f, -sizez / 2f);
gl.glVertex3f(+sizex / 2f, +sizey / 2f, -sizez / 2f);
gl.glVertex3f(+sizex / 2f, -sizey / 2f, -sizez / 2f);
gl.glVertex3f(+sizex / 2f, -sizey / 2f, +sizez / 2f);
gl.glVertex3f(+sizex / 2f, +sizey / 2f, +sizez / 2f);
gl.glVertex3f(-sizex / 2f, +sizey / 2f, +sizez / 2f);
gl.glVertex3f(-sizex / 2f, -sizey / 2f, +sizez / 2f);
gl.glVertex3f(+sizex / 2f, -sizey / 2f, -sizez / 2f);
gl.glVertex3f(+sizex / 2f, +sizey / 2f, -sizez / 2f);
gl.glVertex3f(+sizex / 2f, +sizey / 2f, +sizez / 2f);
gl.glVertex3f(+sizex / 2f, -sizey / 2f, +sizez / 2f);
gl.glVertex3f(-sizex / 2f, -sizey / 2f, +sizez / 2f);
gl.glVertex3f(-sizex / 2f, +sizey / 2f, +sizez / 2f);
gl.glVertex3f(-sizex / 2f, +sizey / 2f, -sizez / 2f);
gl.glVertex3f(-sizex / 2f, -sizey / 2f, -sizez / 2f);
gl.glVertex3f(+sizex / 2f, +sizey / 2f, +sizez / 2f);
gl.glVertex3f(+sizex / 2f, +sizey / 2f, -sizez / 2f);
gl.glVertex3f(-sizex / 2f, +sizey / 2f, -sizez / 2f);
gl.glVertex3f(-sizex / 2f, +sizey / 2f, +sizez / 2f);
gl.glVertex3f(+sizex / 2f, -sizey / 2f, -sizez / 2f);
gl.glVertex3f(+sizex / 2f, -sizey / 2f, +sizez / 2f);
gl.glVertex3f(-sizex / 2f, -sizey / 2f, +sizez / 2f);
gl.glVertex3f(-sizex / 2f, -sizey / 2f, -sizez / 2f);
gl.glEnd();
}
Im eigentlich Render-Vorgang (aufgerufen von display) werden dann die Display-Listen nur noch ausgeführt, vorher wird die Matrix um die aktuelle Position der Entity translatiert:
Java:
@Override
public void display(GLAutoDrawable drawable) {
GL2 gl = drawable.getGL().getGL2();
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
renderCamera(gl);
renderEntities(gl);
gl.glFlush();
public void renderEntities(GL2 gl) {
gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
gl.glLoadIdentity();
for (int i = 0; i < core.getEntities().size(); ++i) {
Entity entity = core.getEntities().get(i);
gl.glPushMatrix();
gl.glTranslatef(entity.getPosx(), entity.getPosy(), entity.getPosz());
gl.glColor3f(entity.getColorr(), entity.getColorg(), entity.getColorb());
gl.glCallList(i);
gl.glPopMatrix();
}
Damit komme aich in etwas auf gerade einmal 30 FPS und ein Mikro-Benchmark zeigt, dass das Ausführen der display Methode ca. 33 ms benötigt von denen nicht einmal 1 ms auf die Methode renderCamera() fällt. Und das auf einen gar nicht mal so alten Gurke... Vielleicht irre ich mich (und der rechner hier ist eine Gurke), aber mir scheint das es da noch optimierungsbedarf gibt. Daher die Frage, ob mir vielleicht jemand einen Tipp geben, wo dieser Code optimiert werden kann.
PS: GL_CULL_FACE ist aktiviert und die glut-Funktion gluSolidCube liefert deutlich schlechtere Ergebnisse.
Vielen Dank im voraus!