2011-06-21 9 views
5

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ę.

image framerate count

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?

+0

, że GC.Collect wygląda powoli - spróbuj znaleźć sposób na wywołanie tej nie-każdej-ramki. – MattS423

+0

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

Odpowiedz

1

Jeśli procesor ma wartość 10%, dzieje się coś poza przetwarzaniem obrazu. Podejrzewam, że odpowiedź na twoje pytanie jest czymś, o czym tutaj nie wspominałeś. np. czytanie z dysku lub czytanie z kamery.

+1

Ale kamera obsługuje swój 21FPS, jak widać na zrzucie ekranu. – Nasenbaer

+0

Chodzi mi o to, że coś oprócz przetwarzania obrazu ma miejsce. Zacznę od komentowania całego kodu w funkcji, czy funkcja zostanie wywołana 21 razy na sekundę? Jeśli tak, problem tkwi w funkcji, jeśli nie, to jest gdzie indziej. Jeśli znajduje się wewnątrz funkcji, musisz sprawdzić, co powoduje, że procesor jest bezczynny. Jak powiedział MattS423, GC.Collect() może być problemem, być może jest to blokujące połączenie. Przez 10 lat nigdy nie używałem GC.Collect, z wyjątkiem testów i zrobiłem wiele niezarządzanych rzeczy, w tym streaming wideo. – MikeKulls

2

Podejrzewam, że obciążenie procesora GPU jest wysokie. Kiedy zrobiłem podobne programy, renderowanie WPF wykorzystuje wiele zasobów GPU i może to być wąskie gardło.

Powiązane problemy