Pracuję w WPF w .Net 4.0. Mam kilka ogromnych zdjęć z aparatu 1392x1040 pikseli. Każda rama jest jak System.Drawing.Bitmap
i zostanie przekształcona BitmapImage za pomocąAktualizacja wydajności - Lepsza liczba klatek na sekundę w WPF
Public Function BitmapToWpfBitmapSource(ByVal bmSrc As System.Drawing.Bitmap) As BitmapSource
If bmSrc Is Nothing Then Return Nothing
Dim res As BitmapSource
Dim Ptr As IntPtr
Ptr = bmSrc.GetHbitmap(System.Drawing.Color.Black) 'Create GDI bitmap object
res = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(Ptr, IntPtr.Zero, System.Windows.Int32Rect.Empty, BitmapSizeOptions.FromWidthAndHeight(bmSrc.Width, bmSrc.Height))
Dim ret As Integer = DeleteObject(Ptr) 'Delete GDI bitmap object
GC.Collect() 'Because the code is not managed, we need to call the collector manually to avoid memory spikes
Return res
End Function
Gdybym zaktualizować obrazy w GUI mogę dostać około 7 klatek/sekundę.
Było kilka możliwości, aby zwiększyć prędkość o malejącej jakości:
- Render z najbliższego sąsiada
RenderOptions.SetBitmapScalingMode(Me.ucWindow1.VideoPresenter1.img1, BitmapScalingMode.NearestNeighbor)
Praca z wątków w górę data każda ramka
Dim As New SetImageDelegate dl (AddressOf UpdateImageInGuiGuiThread) Me.Dispatcher.Invoke (dl imgSrc)
testowane z 32bit i 24bit obrazów - compare Imageformat
Korzystanie Performance profiling suite dla liczby klatek na sekundę:
Ale procesor wciąż ma około 10%, a nie 100%, a liczba klatek na sekundę wynosi około 12 FPS zamiast 39 (WinForm s).
Jak poprawić klatek na sekundę z aparatu?
, że GC.Collect wygląda powoli - spróbuj znaleźć sposób na wywołanie tej nie-każdej-ramki. – MattS423
Powód, dla którego tam jest, wygląda nieprawidłowo. Komentarz mówi, że należy go wywołać, ponieważ kod jest niezarządzany, ale GC.Collect zwolni tylko zarządzane obiekty z pamięci. – MikeKulls