Performance Problem mit Opengl



  • Guten Tag. Woran könnte es liegen, dass die Systemauslastung meines PC beim ausführen des folgenden Beispielprogrammes auf 100% wächst?

    #include <GL/glut.h> 
    
    #include <math.h>  
    
    const  double  pi2 = 6.28318530718; 
    
    /* Pendulum constants */
    
    const  double  omega = 1.0;
    
    const  double  initial_angle = -1.0;
    
    const  double  cord_length = 0.75;
    
    /* Time variables */
    
    const  double  tic  = 0.00025;
    
    static double  time = 0.0;
    
    void idle(void){
    
      /* Increase time by 1 tic */  
    
      time += tic;
    
      /* Redraw the display */
    
      glutPostRedisplay();
    
    };
    
    void winInit(void){
    
      /* Set orthographic 2D coordinate system */
    
      gluOrtho2D(-1.0, 1.0, -1.5, 0.5);
    
    };
    
    void display(void){
    
      static double radius = 0.05;
    
      const double delta_theta = pi2/20;
    
      double xcenter , ycenter;  
    
      double x, y;
    
      double theta = 0.0;
    
      double current_angle = cos(omega * time);
    
      glColor3f(0.0, 0.0, 0.0);
    
      glClear(GL_COLOR_BUFFER_BIT);
    
      glColor3f(1.0, 1.0, 1.0);
    
      /* Draw pendulum cord */  
    
      glColor3f(1.0, 1.0, 1.0);
    
      glBegin(GL_LINES);
    
      glVertex2f(0.0, 0.0);
    
      xcenter = -cord_length * sin(current_angle);
    
      ycenter = -cord_length * cos(current_angle);
    
      glVertex2f(xcenter, ycenter);
    
      glEnd();
    
      /* Draw pendulum dish */
    
      glColor3f(1.0, 0.0, 0.0);
    
      glBegin(GL_POLYGON);
    
      while (theta <= pi2) {
    
        x = xcenter + radius * sin(theta);
    
        y = ycenter + radius * cos(theta);
    
        glVertex2f(x, y);
    
        theta += delta_theta;
    
      };
    
      glEnd();
    
      glutSwapBuffers();
    
    };
    
    int main(int argc, char **argv)  
    
    {  
    
      /* GLUT Initializations */
    
      glutInit(&argc, argv);  
    
      glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);  
    
      glutInitWindowPosition(5,5);  
    
      glutInitWindowSize(300,300);
    
      /* Open Window */
    
      glutCreateWindow("Pendulum");  
    
      /* Window initializations */
    
      winInit();
    
      /* Register callback functions */
    
      glutDisplayFunc(display);  
    
      glutIdleFunc(idle);
    
      /* Launch event processing */
    
      glutMainLoop();  
    
      return 0;  
    
    }
    

    ps: an der Performance des Systems kann es eigentlich nicht liegen.

    danke schonmal im vorraus 🙂



  • Warm solte es anders sein? Du hast praktisch eine Endlosschleife der Art

    while (true)
        zeichne();
    

    natuerlich treibt das die CPU-Auslastung auf 100%, weil die CPU immer am zeichnen ist. Das bedeutet nicht dass du ein Performance-Problem hast 😉
    Du kannst die CPU-Auslastung verringern, indem du Pausen zwischen den einzelnen Frames einbaust, indem du z. B. in deine display-Funktion ein "Sleep(30)" einbaust.


  • Mod

    wieso sollte das programm nicht jede verfuegbare rechenleistung nutzen?



  • naja weil...es ruckelt O.o


  • Mod

    hypersayyajin schrieb:

    naja weil...es ruckelt O.o

    ou, kleines aber wichtiges detail, schoen dass du es uns verraetst.

    2.frage: was hast du bisher unternommen damit es besser laeuft, schon die problemstelle lokalisiert?



  • erm nein...hab ich noch nicht. mich wundert nur, dass das programm an bestimmten stellen "stockt". Könnte das mit Vsync oder der Art der Berechnung der Koordinaten zusammenhängen?



  • hypersayyajin schrieb:

    naja weil...es ruckelt O.o

    Auf meinem PC ruckelt es nicht, und ich bezweifle dass du einen langsameren PC hast als ich. Was genau verstehst du unter "ruckeln"?



  • naja.. die pendelbewegung stoppt pro schwung ca 2 bis 3 mal. das "stocken" oder "stoppen" dauert nur einen bruchteil einer sekunde, ist aber jedoch ziemlich deutlich sichtbar.



  • hypersayyajin schrieb:

    naja.. die pendelbewegung stoppt pro schwung ca 2 bis 3 mal. das "stocken" oder "stoppen" dauert nur einen bruchteil einer sekunde, ist aber jedoch ziemlich deutlich sichtbar.

    Kann es sein dass du irgendwelche Hintergrundprozesse laufen hast, die solche Peaks verursachen und z. B. immer mal wieder auf die Festplatte zugreifen (z. B. Winamp, Filesharing-Programme, ...)? Ich persoenlich seh jedenfalls keinen offensichtlichen Fehler in deinem Programm, und wie gesagt: bei mir laeufts ohne Stocken.



  • ich habe herausgefunden, dass das "stocken" nur bei deaktiviertem vsync auftritt. wenn ich vsync deaktiviere, wird alles animiert wie es sein soll, geschwindigkeit der animation stimmt auch. jedoch verschwimmt die animation ab einer bestimmten geschwindigkeit. in meinem fall, einer pendelanimation, tritt dieser effekt bei steigender kinetischer energie, also bei steigender geschwindigkeit, auf.

    wie lässt sich das verhindern?


Anmelden zum Antworten