Announcement

Collapse
No announcement yet.

Zeichnen von Linien beschleunigen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zeichnen von Linien beschleunigen

    Hallo Leute,

    ich habe ein Panel-Control, auf das ich mit Hilfe seines Paint-Ereignisses Linien aus einem Array von Punkten zeichnen lasse.
    Code:
            private void panel_Signal_Paint(object sender, PaintEventArgs e)
            {
                g = e.Graphics;
                
                for (int i = 1; i < panel_Signal.Width; i++)
                    g.DrawLine(penSignal, i - 1, intSignal[i - 1], i, intSignal[i]);
            }
    Dabei lässt sich beobachten, wie sich das Linienbild aufbaut. Da sich die Werte des Array jede Sekunde ändern, werden diese Werte auch sekündlich neu gezeichnet, und das nimmt ordentlich Rechenzeit in Anspruch. Welche Möglichkeiten habe ich, das Ganze zu beschleunigen?

    Bin für jede hilfreiche Antwort dankbar.

    Gruß,
    Marco

  • #2
    Muss es ein Panel sein? Eine Picturebox kann auch so ohne Event bemalt werden. Das würde vermeiden, dass der Aufbau der Oberfläche immer neu angestoßen werden.
    Schöne Grüße, Mario

    Comment


    • #3
      Danke, gute Idee. Wie sieht dann der Code aus, damit dann auch die Linien innerhalb der Picturebox gezeichnet werden und nicht auf der Form?

      Gruß MArco

      Comment


      • #4
        Arbeite am besten mal das hier durch:
        http://www.mycsharp.de/wbb2/thread.php?threadid=21782
        Schöne Grüße, Mario

        Comment


        • #5
          Gibt es eine native Methode? Denn das Signal (= die Linien) muss bei Aktualisierung komplett neu gezeichnet werden, und das auf einer Breite von 480 Pixeln (Bildschirmbreite). Das ist zwar nicht sonderlich viel, nur läuft dies auf Windows Mobile 5 recht gemütlich, so dass man den Linienaufbau sehen kann.

          Gruß
          Marco

          Comment


          • #6
            Hmm, wenn es Geschwindigkeitsprobleme gibt, gibt es mehrere Ansätze:

            Native ist nicht zu empfehlen, da Du ja in .Net arbeitest. Hier habe ich, speziell auch im Mobile keine Erfahrung.

            Prüfen, was im Timer wirklich neu gezeichnet werden muss. Immer das ganze Teil oder reicht ein begrenzter Update?

            DoubleBuffered und auf ein Control zeichnen, ist oft eine gute Wahl, kann aber auf Mobil von der Geschwindigkeit her total nach hinten los gehen, da dazu der gepufferte Bereich ja erst mal zwischengespeichert wird und dann nur in den Vordergrund kopiert wird. Auf dem normalen Rechner macht das quasi die Grafikkarte in Nullzeit.

            Wenn Du beim Zeichnen der Linien zuschauen kannst, könnte ein BeginUpdate EndUpdate auf dem Control oder der Picturebox auch hilfreich sein. Ein weiterer Ansatz: Auf einem frisch erstellte Bitmap zeichnen und diese dann Picturebox zuweisen. Somit bleibt das eigentliche Zeichnen unsichtbar und sollte schneller sein.

            Ganz ganz wichtig: Den Speicher im Auge behalten. Bitmaps MÜSSEN mit Dispose nach Verwendung freigegeben werden. Erstellt man immer neue Bitmaps und weist die einer Picturebox zu, muss man vorher am Besten die Referenz auf die alte Bitmap retten und dann Disposen, sonst geht der Speicher nach oben...

            Wenn es eine zentrale und sehr wichtige Funktion ist, lohnt evtl. auch der Einsatz von DirectX. Das ist allerdings keine Sache, die man in einem Tag so mal hinsetzt.
            Schöne Grüße, Mario

            Comment

            Working...
            X