QGraphicsScene Buffer



  • Hallo!

    Ich möchte viele Linien und Punkte in eine QGraphicsScene zeichnen. Das funktioniert auch recht gut, ABER es ist mir etwas zu langsam.

    Die Probleme sind

    1. Ich muss immer neue Linien und Punkte zeichnen, die nichts mit den alten zu tun habe. Aus diesem Grund lösche ich die QGraphicsScene immer vollständig und füge dann neue Items in die Scene ein.

    2. Die QGraphicsScene sendet glaube ich nach jedem addLine, etc. ein update Signal. Kann man das irgendwie unterbinden? Am liebsten wäre mir, wenn ich das update Signal von der QGraphicsScene komplett entfernen könnte, bzw. nur selbe triggern kann.

    Habt ihr Ideen, wie ich meine Probleme lösen kann?
    Meine Ideen:
    ad 1) Ich vererbe von QGraphicsScene und erzeuge mir einen QGraphicsItem buffer. Anstatt alle Objekte aus der Scene zu löschen, schalte ich sie einfach auf unsichtbar. Dann überlade ich die addLine Funktion und greife auf diesen Buffer zurück und erzeuge nur eine neue Linie, wenn im Buffer noch nichts vorhanden sind. - Habt ihr dazu Erfahrungen?

    ad 2) ich habe schon versucht mit blockSignals das update Signal zu verhindern - hat aber nicht wirklich geklappt. Kann ich das Signal irgendwie von der View disconnecten und ein eigenes benützen?

    Lg,
    Philipp



  • Nö. AddLine ruft update() auf - ja. Das auch bei jedem AddLine. Nur wenn du die Doku liest erfährst du, dass nicht jedes update einen direkten repaint bedeutet, sondern es gibt für die ganzen update()s auf ein widget genau ein repaint() in der nächsten Runde der EventLoop.

    Von wie vielen lines reden wir denn?
    Wie hoch ist die update-Frequenz, also das Zeitintervall zwischen den scene.clear()?
    Müssen wirklich ALLE entfernt werden?



  • Hallo!

    Ja es müssen leider alle entfernt werden und es können gut 500 Linien sein (die überlappen sich auch relativ oft, wenn das von Bedeutung ist).
    Es handelt sich dabei um ein Kamerabild mit typischerweise >60 fps und im Kamerabild werden linien eingezeichnet (es wird sowas ähnliches wie hough line detection gemacht). Natürlich ist's mir theoretisch relativ egal, wenn nicht wirklich für jedes Frame alles eingezeichnet wird, deshalb würde ich den Repaint auch gerne irgendwie selber triggern:
    Es wäre okay, wenn nur alle 100 ms die Linien eingezeichnet werden - nur weiß ich leider nicht wie ich das bewerkstelligen kann.

    Wenn der eventloop nur einmal alle Updates zusammenfässt, dann wird das bottleneck aber wohl das andauernde löschen von den Linien sein und das anschließende neu-hinzufügen. Hast du irgendwelche Erfahrungen, ob das Buffern etwas bringt, oder andere Vorschläge, wie ich schneller Linien in mein Kamerabild einzeichnen kann in einer graphicsview, oder vielleicht auch auf einem anderen weg?

    Lg,
    Philipp


  • Mod

    Ist wohl auch die Frage, ob QGraphicsScene das richtige für so etwas ist.
    Auf OpenGL Rendering hast du umgestellt, oder?



  • Ich hab den Viewport auf OpenGL umgestellt, aber wirklich schneller ist's dadurch nicht. Gibt's irgendwelche RednderHints die das ganze beschleunigen?
    Alles was ich darüber finde ist für qt 4.2 und daher ziemlich veraltet.

    Ich Brauch die GraphicsScene eigentlich weil ich auch bewegbare Overlays wie Kreise haben möchte. was wäre denn die "beste", dh schnellste, Alternative, bzw. Wie würdet ihr das machen? - die Schwierigkeit dabei ist wie gesagt, dass sich die Linien durchgehend ändern können, dh ein statischer Vertexbuffer oder dergleichen geht nicht.

    Lg



  • Wenn es darum geht viele Objekte in einem Rutsch zu zeichnen habe ich gute Erfahrungen mit glDrawArrays gemacht. Da gings aber um QGLWidget. Kann dir nicht sagen wie einfach sich das in einer QGraphicsScene verwenden lässt.



  • Ich zeichne meine Linien jetzt nicht mehr mit den GraphicItems sondern manuell mit OpenGl mit glVertex und funktioniert tadellos - werd's dann noch auf glDrawArrays umstellen. Nicht dynamische Objekte kann ich so immer noch direkt mittels der GraphicsScene zeichnen.

    Lg, Philipp


Anmelden zum Antworten