2016-04-18 13 views
0

Was ist der effizienteste Weg, um ein Image mit neuen Daten in C# neu zu zeichnen?C# effizient neu zeichnen Bild mit neuen Daten

Die externe DLL, die ich verwende, reserviert einen Bytepuffer, um meine Pixeldaten (Breite * Höhe * BytesPerPixel) zu halten, wo jedes Pixel im ARGB32 Format ist. Die DLL aktualisiert diesen Puffer automatisch mit neuen Daten, indem sie mit der Hardware interagiert, und ruft dann einen C# -Rückruf an, der besagt, dass neue Daten bereit sind zu gehen. Gerade jetzt, mein Schema die neuen Daten für die Anzeige ist

var bmp = new Bitmap(_size.Width, _size.Height, PixelFormat.Format32bppArgb); 
var bitmapData = bmp.LockBits(
       new Rectangle(new Point(0, 0), _size), 
       ImageLockMode.UserInputBuffer | ImageLockMode.WriteOnly, 
       PixelFormat.Format32bppArgb, 
       unmanagedByteDataPtr); 
bmp.UnlockBits(bitmapData); 
myGui.ImageCtrl.Image = bmp; 

Dies schafft eine neue Bitmap jedes Mal, die eine Speicher/Leistungseinbuße hat. Da sich meine Bildgröße nicht ändert, gibt es einen effizienteren Weg, dies zu tun?

Antwort

1

Sie verwenden den falschen Konstruktor. Erstellen Sie einfach eine Bitmap direkt von den nicht verwalteten Daten, und es wird wickeln die Daten, anstatt eine neue Bitmap zu schaffen es einfach wegzuwerfen sofort:

new Bitmap(_size.Width, _size.Height, 4 * _size.Width, PixelFormat.Format32bppArgb, 
      unmanagedByteDataPtr); 
+0

Danke für die Anregung. Ich habe das ausprobiert, aber es scheint die CPU nicht zu verbessern. Wird mit diesem Vorschlag nicht jedes Mal ein neues Bitmap-Objekt erstellt? Wie ich es verstehe, verweisen beide Methoden einfach auf die tatsächlichen nicht verwalteten Pixeldaten als Puffer. Das führt mich zu der Annahme, dass die Speicher-/CPU-Nutzung von der Tatsache herrührt, dass ich Bitmap-Objekte in jedem Frame erzeuge und entsorg. –

+1

@PaulGrinberg Haben Sie einen Profiler verwendet? Das Bitmap-Objekt selbst hat keine Daten, es ist nur ein Wrapper für eine GDI + -Bitmap, die wiederum nur auf Ihren Speicherort verweist, anstatt sie zu kopieren. Vielleicht ist dein Problem einfach woanders? – Luaan

+0

Danke für den Vorschlag. Nachdem ich erkannt hatte, dass mein Problem nicht die Bitmap-Erstellung ist, suchte ich nach dem Speicherleck woanders und fand es. –

Verwandte Themen