Performance bei OpenGL



  • Hallo Leute,
    mal ne Frage zur Performance bei OpenGL mit C++.
    Keine Ahnung in welches Subforum das gehört.

    Naja, es geht um die Render()-Methode meiner OpenGL-Klasse. Diese wird ja ständig ausgeführt. In ihr befinden sich folgende Codezeilen:

    if(triangles){
    		for(unsigned int i = 0; i < model->FaceList.size(); i++){
    		Face myFace = model->FaceList[i];
    		Vec x = model->VertexList[myFace.x];
    		Vec y = model->VertexList[myFace.y];
    		Vec z = model->VertexList[myFace.z];
    		glBegin(GL_TRIANGLES);
    		glVertex3d(x.x,x.y,x.z);
    		glVertex3d(y.x,y.y,y.z);
    		glVertex3d(z.x,z.y,z.z);
    		glEnd();
    		}
    	}
    

    Man sieht hier, dass ich die Variablen MyFace, x, y und z in jedem Durchlauf neu deklariere. Ist es besser aus diesen globale Variablen zu machen um die Performance zu verbessern ? Soll ich sie eventuell schon im Header deklarieren ?
    Danke

    Blue


  • Mod

    diese deklaration hat keine laufzeit kosten und ist an dieser stelle am performantesten.



  • glBegin() und glEnd() sollten aus der Schleife rausgenommen werden.
    Außerdem schauts so aus, als könnte man sich die Instanzierung von myFace und der drei Vecs sparen bzw. mit Referenzen arbeiten, was schneller sein könnte.



  • ich sehe doch richtig, dass deine faceList einfach nur die koordinaten für eine reihe von dreiecken enthält, oder?
    warum machst du aus deinre faceList kein vertexarray und malst dann mittels glDrawElements oder glDrawArrays alle dreiecke auf einmal? das ist um einiges schneller als der aufruf, den du geschrieben hast.



  • wenn du mit VBOs abrbeitest kommst du noch sehr viel schneller voran. wenn die daten, die du renderst nicht geändert werden ist es aber eventuel einfacher das mit displaylisten zu machen (zumindest hab ich am anfang nur die displaylisten verstanden da ich noch recht neu sowohl in c/c++ als auch opengl war)

    emfehlen kann ich hier für beides die von joachim rohde übersetzten nehe tutorials.



  • Oermel schrieb:

    wenn du mit VBOs abrbeitest kommst du noch sehr viel schneller voran.

    jup. ist aber auch nur eine änderung von ein paar wenigen zeilen code, wenn du das vertex-array mal hast, um es dann noch im grafikspeicher abzulegen.
    die zeichen routine bleibt im prinzip erhalten. es ist nur eine etwas andere form das aktuelle array auszuwählen, bevor man es per drawarrays malt.



  • Danke, werd mir eure Vorschläge mal zu Gemüte führen und anschließend über meine Erfolge berichten. 😃

    Blue


Anmelden zum Antworten