Plotten in realtime zu langsamm und andere fragen zu glut
-
Hallo, ich habe ein Programm Geschrieben. Leider laufen die Plots extrem langsamm. Und ich möchte fragen ob das so in Zeile 64-90 richtig sein kann, denn ansonsten, wenn ich die Ergebnisse in eine Textdatei ausgebe, ist es nach sekunden fertig. Auserdem möchte ich fragen, wie man in dem Glutfenster text ausgeben kann. Ich möchte die anzahl der Schritte ausgeben und möglichst beschriften.
Danke
... }
-
Also, irgendwie schreibst du ja nicht, wieviel zu langsam...
// Clear und dann Swap? glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glutSwapBuffers(); for(int k=1;k<=tN;++k){ // [...] // Könnte man hier nicht auch einfach eine der API-Funktionen benutzen, // die einen Line-Strip aus einem Array über genau einen Aufruf darstellt? for(int i=1;i<x.size()-1;++i) { // x.size()*3 state changes in dieser Schleife! glBegin(GL_LINES); // immer dieselbe farbe, warum immer wieder setzen? glColor3f(0,0,0); // Das sieht mir verdächtig nach einem Line-Strip aus, // den man auch in der hälfte der API-calls hinbekommt glVertex2f(x[i], u[i]); glVertex2f(x[i+1],u[i+1]); glEnd(); } glFlush(); // Was soll das hier? Warum flushst du, warum clearst du? // Du hast pro Frame tN clears! // aber überhaupt nur einmal rufst du swap buffers auf, und das auch noch nach einem weiteren clear da oben Oo glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); }
-
Ich schließe mich mal mit vielen Fragezeichen Decimad an.
Vorausgesetzt der restliche Code ergibt ein wenig mehr Sinn. Dann würde ich es auf die schnelle so machen:
void display(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBegin(GL_LINES); glColor3f(0,0,0); for(int k=1;k<=tN;++k){ for(int i=0;i<xN+1;++i){ Roe(gam,q1,q2,q3,f1,f2,f3,i); } //compute new conservative variables for(int i=1;i<xN+1;++i){ q1[i] = q1[i]-quot_dtdx*(f1[i]-f1[i-1]); q2[i] = q2[i]-quot_dtdx*(f2[i]-f2[i-1]); q3[i] = q3[i]-quot_dtdx*(f3[i]-f3[i-1]); u[i] = q2[i]/q1[i]; p[i] = (gam-1.0)*(q3[i]-0.5*q2[i]*q2[i]/q1[i]); for(int i=1;i<x.size()-1;++i){ glVertex2f(x[i], u[i]); glVertex2f(x[i+1],u[i+1]); } } } glEnd(); glutSwapBuffers(); }
-
Hallo, leider kenne ich mich garnicht aus in glut bzw. open GL. Bisher war das nur alles try and error. Und außerdem ist mir oben noch eine Klammer verrutscht, aber der Code macht schon sinn. Also das ist, was ich vorhabe:
for(int k=1;k<=tN;++k){ //hier werden die vektoren berechnet fuer jeden Zeitschritt durch die beiden schleifen for(int i=0;i<xN+1;++i){ ..... } //compute new conservative variables for(int i=1;i<xN+1;++i){ q1[i]=...; q2[i]=...; q3[i] =...; u[i] =...; p[i] = ...; } //zu diesem zeitpunk k soll nun geplottet werden //da zu dem zeitpunkt k+1 der plot anders aussieht, soll der vorherige plot geloescht werden }
Ich brauche also tN plots und möchte sie alle nacheinander aufrufen damit es wie in Echtzeit aussieht.
Edit: Also ich habe jetzt die klammer richtig gesetzt und so gemacht wie Osbios vorgeschlagen hat, danke dafür, und es macht genau das, was ich möchte.
Kann mir jenad trotzdem verraten, wie ich Text im Fenster ausgeben kann? U
-
Hallo, das Programm tut jetzt genau das, was es soll, kann aber vielleicht jemand mit Ahnung ein blick auf die display funktion werfen. Thx
void display(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); for(int k=1;k<=tN;++k){ glBegin(GL_LINES); glColor3f(0,0,0); for(int i=0;i<xN+1;++i){ Roe(gam,q1,q2,q3,f1,f2,f3,i); } //compute new conservative variables for(int i=1;i<xN+1;++i){ q1[i] = q1[i]-quot_dtdx*(f1[i]-f1[i-1]); q2[i] = q2[i]-quot_dtdx*(f2[i]-f2[i-1]); q3[i] = q3[i]-quot_dtdx*(f3[i]-f3[i-1]); u[i] = q2[i]/q1[i]; p[i] = (gam-1.0)*(q3[i]-0.5*q2[i]*q2[i]/q1[i]); } //set open bondary conditions q1[0]=q1[1]; q1[xN+1]=q1[xN]; p[0]=p[1]; p[xN+1]=p[xN]; u[0]=u[1]; u[xN+1]=u[xN]; for(unsigned int i=1;i<x.size()-1;++i){ glVertex2f(x[i], q1[i]); glVertex2f(x[i+1],q1[i+1]); } glEnd(); glFlush(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } }
-
Warum? ist irgendwas nicht in Ordnung? Ich sehe bislang nur, dass sie miserabel eingerückt ist. Hiermit habe ich bestätigt, dass ich einen Blick drauf geworfen habe.