WPF: Wie effizient aktualisieren ein Bild 30 mal pro Sekunde
Ich Schreibe eine WPF-Anwendung, die verwendet eine Komponente, und diese Komponente gibt einen pointer (IntPtr), um Pixel einer bitmap-Grafik (stride * Höhe). Ich weiß im Voraus, dass die bitmap ist eine 24 Bits rgb, seine Breite und Höhe.
Aktualisierung des Bild-Steuerelements mit diesen bitmaps macht ein video für den Benutzer, aber ich bin mir nicht sicher, was ist der effizienteste Weg, dies zu tun, die meisten der Zeit, die die CPU-Auslastung geht bis 75%+ und Speicher ändern von 40 MB auf 500 MB und die nI denke, dass GC beginnt zu arbeiten und dann fällt es wieder bis 40mm. Die app beginnt nicht reagieren.
Was soll ich tun?
Dank!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie wahrscheinlich der Zuweisung von neuen Bitmaps, die nicht Einweg. Ordnen Sie eine einzelne
WriteableBitmap-Objekt
und zu aktualisieren, dass stattdessen. Die verlinkten Dokumentation beschreibt den Prozess, der hinter sperren, aktualisieren, und entsperren einesWriteableBitmap
Auf software, ich arbeite mit live-Ultraschall-Bilder in WPF, erhalte ich eine Windows Forms Bitmap, welche kopiere ich in das WriteableBitmap-Objekt direkt über die native CopyMemory-Methode. Auch mit diesem mehr komplizierte Arbeit, die CPU ist nicht angespannt zu hart, und die Speicherauslastung bewegt sich nie, solange ich ordnungsgemäß entsorgen, was ich kann. Hoffentlich diesem Beispiel können Sie helfen:
Wo CopyMemory ist definiert als:
WritableBitmap
im UI-thread. Denn wenn Sie nicht, Sie erhalten InvalidOperation, wenn dabeibitmap.Lock()
im UI-thread z.B. inCompositionTarget.Rendering
oder jedes andere event-handlerVerwendung der convenience-Methode genannt
WritePixels
aufWriteableBitmap
können wir schreiben es etwas kürzer, etwa so: