Ich habe, was ich vermute, ein Speicherfragmentierungsproblem.WPF-Speicherfragmentierung
Wir haben kürzlich unsere WinForms-Anwendung in eine WPF-Anwendung portiert. Es gibt eine Bildverarbeitung, die diese Anwendung ausführt, und diese Verarbeitung hat immer in der WinForms-Version der App funktioniert. Wir gehen zu WPF, und die Verarbeitung stirbt ab. Das Debugging in die Bibliothek hat den Tod an zufälligen Punkten, aber immer mit einem Array, das null ist, dh die Zuweisung ist fehlgeschlagen.
Die Verarbeitung selbst erfolgt in einer C++ - Bibliothek, die von p/invoke aufgerufen wird und ziemlich speicherintensiv ist; Wenn das gegebene Bild N × M Pixel groß ist, dann ist das Bild N × M × 2 Bytes groß (jedes Pixel ist ein vorzeichenloser Kurzschluss und es ist ein Graustufenbild). Während der Verarbeitung werden Bildpyramiden erstellt, die sich im Float-Bereich befinden, so dass die gesamte Speicherbelegung N x M x (2 + 2 + 4 + 4 + 4 + 4) ist, wobei die erste 2 die Eingabe, die zweite ist 2 ist der Ausgang, der erste 4 ist der Eingang in Floats, der zweite 4 ist das 0th Level Difference Bild, und die letzten 2 Viere sind der Rest der Pyramide (da sie Pyramiden sind und jedes Level halb so groß ist Richtung, diese 4s sind obere Grenzen). Also, für ein 5000x6000 Bild, das sind 600 mb, was gut in den Speicher passen sollte.
(Es gibt die Möglichkeit, dass das Marshalling die Speicheranforderung durch ein anderes N x M x 4 erhöht, dh die Eingabe- und Ausgabebilder auf der C# -Seite und dann die gleichen auf die C++ - Seite kopierten Arrays - Marshalling Anforderung größer sein?)
Wie fragmentiert ist WPF im Vergleich zu WinForms? Gibt es eine Möglichkeit, Speicher zu konsolidieren, bevor diese Verarbeitung ausgeführt wird? Ich vermute, dass Fragmentierung das Problem ist, aufgrund der zufälligen Natur der Brüche, wenn sie passieren, und dass es immer ein Speicherzuweisungsproblem ist.
Oder sollte ich dieses Problem vollständig vermeiden, indem ich die Verarbeitung als separaten Prozess mit Datentransfer über Sockets oder ähnliches ausführen lasse?
ich über diesen Verarbeitungscode oft gegangen sind. Wenn es leckt oder sich schlecht benimmt, sehe ich es einfach nicht; aber die Pausen begannen definitiv, als wir von Winforms zu WPF gingen. Der Code ist ansonsten identisch. – mmr