QtOpenGL, das Video beschleunigt nach der Pause



  • Hallo,
    ich habe eine kleine Anwendung geschrieben, in der ich aus einer Datei XYZ-Werte auslese und sie 3dim. darstelle. Das Problem ist, dass die Ausgabe nach einer "Pause" beschleunigt-bis zu einem bestimmten Zeitpunkt- abgespielt wird, dann wieder mit normalen Tempo. Wenn ich auf dem Pause-Knopf klicke, dann hält das Video auch an.
    Um die Werte zu zeichnen verwende ich einen extra Thread. Wenn der Benutzer(Ich) auf den Pausebutton klickt, dann verlässt der Thread die run() Methode-hier wird in und aus der Variable gelesen- und wird von mir terminiert. Die Werte die ausgeben werden, befinden sich in einer Variable und nach jedem Durchgang aktualisiere ich die Variable und gebe sie anschließend aus. Für meine Anwendung bedeutet das, dass ein neuer Thread gestartet wird und da fortsetzt wo der alte aufhörte.
    Aber warum, wir die Ausgabe anschließen beschleunigt abgespielt? Die Dauer der schnellen Wiedergabe, hängt von der Dauer der Pause ab.

    Hatte jemand ein ähnliches Problem gehabt??

    Danke im Voraus!!



  • Hallo DerType,

    ich würde jetzt mal darauf tippen, dass du immer erst zeichnest, wenn die Daten gelesen wurden. Wenn du die Daten kontinuierlich lädtst und gleichzeitig abspielst passt alles. Unterbrichst du den render-Vorgang, werden die Daten im 2. Thread trotzdem weitergeladen und wenn du wieder rendern lässt liegen die Daten bereits vor, so dass nicht mehr gewartet werden muss.

    Viele Grüße,
    MaBa



  • Hallo MaBa,
    danke für deine Antwort.

    ich würde jetzt mal darauf tippen, dass du immer erst zeichnest, wenn die Daten gelesen wurden.

    Das stimmt, nur tue ich das alles in einem Thread.

    Hier meine Schleife aus der run() Mehtode:

    while(shouldPlayVideo) {
            valueUpdate (*hnd); //nächster Frame wird gelagen
            executeMethods();  //werte werden manipuliert
            pointCloud->setPixel(hnd,imageSize);
            pointCloud->update();
        }
    


  • Hallo DerType,

    d.h. während dein Video pausiert, werden keine Daten geladen bzw. weiterverarbeitet? Hast du das mal gecheckt?

    Viele Grüße,
    MaBa



  • d.h. während dein Video pausiert, werden keine Daten geladen bzw. weiterverarbeitet? Hast du das mal gecheckt?

    Ja, das habe ich. Die Daten werden in der run() Methode geladen, weiterverarbeite und gezeichnet. Wenn der Thread terminiert, dann verlässt er die run() Methode und diese Schritte sollten nicht mehr abgearbeitet werden.
    Bei mir werden die 3d-Koordinaten nicht in einem Buffer-Stack gespeichert. Es wird immer der nächste Frame geladen. Wenn die Anwendung während des Pausierens, weitere Daten laden würde, dann müsste die Anwendung nach der Pause mit dem (n+in der Pause verarbeiteten Fames)-Frame weiterarbeiten.

    Hat openGL einen Stack, der in Abhängigkeit seiner Fülle die Entleerung vornimmt?
    Zum Beispiel: Wenn die Größe des Stackes < 50, dann zeichne die Daten mit 25 fps und wenn > 50, dann mit 50fps.



  • Hat openGL einen Stack, der in Abhängigkeit seiner Fülle die Entleerung vornimmt?
    Zum Beispiel: Wenn die Größe des Stackes < 50, dann zeichne die Daten mit 25 fps und wenn > 50, dann mit 50fps.

    Wenn du double-Buffering verwendest, dann kannst du in den Backbuffer zeichnen und Front- und Backbuffer tauschen, wenn fertig gezeichnet wurde. Damit kann man sich (im Vergleich zum single-Buffering) ggf. Ruckler ersparen. Ansonsten gibt es nichts was deinem Beispiel gleich kommt.

    Die Framerate hängt vom System, vom Treiber und der Auslastung ab. Was du natürlich machen kannst, ist die Framerate zu limitieren. Zur Berechnung kannst du die Zeit verwenden, die zwischen 2 Frames vergeht. Aber das behebt (wenn überhaupt) nur die Symptome und nicht die Ursache.

    Viele Grüße,
    MaBa


Anmelden zum Antworten