Announcement

Collapse
No announcement yet.

Pixelzugriff mit Lockbits vs Arrayzugriff auf 2D-Array

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

  • Pixelzugriff mit Lockbits vs Arrayzugriff auf 2D-Array

    Hi,
    Ich habe mir bereits den Artikel
    "GetPixel und SetPixel um Längen geschlagen. 800 mal schneller " durchgelesen.

    Dadurch und aus einigen weiteren Foren habe ich mir eine Bitmapk-Klasse gebaut, die mir per LockBits den Zugriff auf einzelne Pixel gewährt.
    Nun greife ich unsafe auf einen Pointer (pBase) zu, den ich per bitmap.Scan0 initialisiere.
    Jeder Pixel entspricht zwei Bytes (PixelFormat.Format16bppRgb555) wobei für mich jeweils nur das zweite Byte interessant ist.

    Meine Funktion zum Pixel auslesen sieht wie folgt aus:

    [highlight=c#]
    public byte GetPixelstate(int x, int y)
    {
    return (byte)*(pBase + y * PictureWidth + x *2 +1);
    }
    [/highlight]

    Leider ist für mich das Auslesen hierdurch immer noch zu langsam.

    Wenn ich beispielsweise bei einem Bild mit 40000x3000 Pixeln, jeden Pixel einmal auslese benötige ich hierfür 5028 ms.

    Wenn ich mir ein 2D-byte-Array erstelle, das aus 40000 Spalten und 3000 Zeilen besteht und dort jede Zelle einmal auslese benötigt das nur noch 1223 ms


    Meine Frage wäre, wodurch ich so viel Zeit verliere? Ich dachte, wenn ich unsafe mit einem Zeiger arbeite, dass ich dann so schnell seim müsste wie mit einem Array.

    Gibt es Funktionen, um noch schneller zu werden?
    Würde es helfen per dllImport die gdi32.dll einzubinden und deren Funktionen zu verwenden?

    Vielen Dank Hannes

  • #2
    Hallo Hannes,

    wenn du statt einem 2D-Array wie double[,] ein jagged-Array nimmst, also double[][], sollte es nochmal schneller sein.

    Eine genaue Ursache kenn ich nicht, kann also wenn auch nur vermuten. Genaueres wirst du mit einem (guten) Profiler rausbekommen. So rein vom Gefühl her tippe ich auf günstigeres Cache-Line Verhalten beim Array-Zugriff.

    Hast du beim Vergleich auch beim 2D-Array den gleichen Aufwand im Zugriff erzeugt, also das return (byte)*(pBase + y * PictureWidth + x *2 +1); berücksichtigt? Das wird zwar noch was ausmachen, aber sicher nicht die 5-fache Laufzeit.

    Es wäre auch zu testen ob WPF od. Cairo schneller als GDI+ sind.


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

    Comment


    • #3
      Danke für die schnelle Antwort.

      Beim Array-zugriff habe ich die Arrayschreibweise verwendet
      (Arr[x,y]).
      Ich werde das nochmals mit dem selben Aufwand versuchen und dannRückmeldung geben.

      Gruß Hannes

      Comment

      Working...
      X