Announcement

Collapse
No announcement yet.

GDI Alternative?

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

  • GDI Alternative?

    Hi,

    ich muss bei meinem Programm sehr viele Linien mehrmals hintereinander in eine Bitmap zeichnen. Ich nutze hierzu GDI+ (DrawLine(...) eines GraphicsElements, das mit der Bitmap verknüpft ist)

    Nun benötige ich beispielsweise für 35000 Linien 1594ms. Diesen Vorgang müsste ich 10 mal durchführen.

    Ich muss das machen, da ich die Linien als Vektoren mit bestimmter Breite (Startpunkt, Endpunkt und Breite) zur Verfügung habe und an bestimmten Stellen prüfen muss, ob dort ein Linienpunkt vorhanden ist, oder nicht.

    Also verwende ich zum Zeichnen die DrawLine(...)-Funktion eines GraphicsElements
    und zum checken, ob an bestimmten Stellen Linienpunkte sind die GetPixel-Funktion der zugehörigen Bitmap.

    Da das Zeichnen der Linien zu lange dauert nun meine Frage:
    Gibt es eine Möglichkeit, die DrawLine(...)-Methode zu verschnellern?
    Ist es mit XNA, DirectX, OpenGL... möglich mein Problem performanter zu lösen? (Linies zeichnen und Pixel auslesen).

    Ich habe es schon mir DrawLines(...) versucht, was aber Fehler im Bild verursacht.


    Vielen Dank
    Hannes

  • #2
    Muss das eine Windows Forms/WPF sein? Oder kann es ein beliebiger Anwendungstyp sein? Ich könnte mir schon vorstellen dass z.B. XNA dafür wesentlich besser geeignet ist. XNA ist übrigens auch sehr einsteigerfreundlich. Ich hab mir das letztens auch erst angesehen und war wirklich überrascht wie einfach man dort Spiele entwickeln kann

    Comment


    • #3
      Hallo,

      beim Zeichnen für/in Bitmaps würde ich WPF mit dem RenderTargetBitmap verwenden. Das basiert (intern) auf DirectX und kann auch parallelsiiert werden, was ja bei GDI nicht funktioniert.

      Für GDI+ siehe auch GetPixel und SetPixel um Längen geschlagen. 800 mal schneller.

      da ich die Linien als Vektoren mit bestimmter Breite (Startpunkt, Endpunkt und Breite) zur Verfügung habe und an bestimmten Stellen prüfen muss, ob dort ein Linienpunkt vorhanden ist, oder nicht.
      Wenn die "Verbildlichung" nicht gefordert ist, dann würde ich da nur rechnen. Das wäre das schnellste, aber ich weiß nicht was dahinter steckt, deshalb nur als Idee.

      Wenn die Ausgabe ein Vektorgrafik wie SVG, EPS, PDF sein sollte dann würde ich mit Cairo zeichnen.


      mfG Gü
      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

      Comment


      • #4
        Vielen Dank für die schnellen Antworten.

        @fanderlf:
        XNA wäre möglich. Das werde ich mir mal anschauen.

        @gfoidl:
        Nein, die Verbildlichung ist nicht gefordert.
        Die gegenenen Linien werden über Startpunkt, Endpunkt und Linienbreite beschrieben.
        Diese Linien können sich beliebig überlagern. Nun will ich einen Algorithmus entwickeln, mit dem ich eine Umrandung (mit bestimmter Breite) der Gesamtform erhalte. Diese Umrandung soll wieder aus Linien mit Startpunkt, Endpunkt und Linienbreite bestehen. Also ist eine rein rechnerische Lösung denkbar.

        Das würde dann bedeuten, dass man ein 2D-Array aufzieht, dessen Felder gesetzt werden, wenn sie einen Linienpunkt enthalten, oder?

        Dann könnte ich statt mit GetPixel zu arbeiten manuell auf die Elemente des Arrays zugreifen.

        Was mich von dieser Lösung bis jetzt abhielt sind die praktischen Funktionen um auf ein Bild zu zeichnen. Wenn ich ein Array verwende, fallen die Methoden zum zeichnen einer Linie weg und ich muss jeden "Pixel" einer Linie selbst in das Array eintragen, oder?

        Vielen Dank
        Hannes

        Comment


        • #5
          Hallo,

          schau dir mal den GraphicsPath aus System.Drawing an. Ich denke der passt für das was du vorhast genau.


          mfG Gü
          "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

          Comment

          Working...
          X