Utworzono formant WPF (dziedziczący z FrameworkElement), który wyświetla kafelkową grafikę, którą można przesuwać. Każdy kafelek ma 256x256 pikseli przy 24 bpp. Nadpisałem OnRender. Tam ładuję nowe płytki (jako BitmapFrame), a następnie rysuję wszystkie widoczne kafelki za pomocą drawingContext.DrawImage.Wydajność renderowania WPF z BitmapSource
Teraz, gdy jest więcej niż kilka nowych płytek na cykl renderowania, liczba klatek na sekundę spada z 60 fps do zera na około sekundę. Nie jest to spowodowane ładowaniem obrazów (co zajmuje milisekundy) ani rysowaniem DrawImage (co nie zabiera wcale czasu, ponieważ wypełnia jedynie pewną pośrednią strukturę danych renderowania).
Domyślam się, że wątek renderowania sam się dławi, ilekroć otrzyma dużą liczbę (~ 20) nowych instancji BitmapSource (czyli tych, które nie zostały jeszcze buforowane). Albo spędza dużo czasu konwertując je do jakiegoś wewnętrznego formatu kompatybilnego z DirectX, albo może to być problem z buforowaniem. Nie może zabraknąć pamięci RAM wideo; Perforator pokazuje szczyty poniżej 60MB, mam 256MB. Ponadto, Perforator mówi, że wszystkie cele renderowania są przyspieszane sprzętowo, więc to też nie może być.
Wszelkie spostrzeżenia są mile widziane!
góry dzięki
Daniel
@RandomEngy:
BitmapScalingMode.LowQuality zmniejszył problemu trochę, ale nie pozbyć się go. Już ładuję płytki w zamierzonej rozdzielczości. I nie może to być sterownik graficzny, który jest aktualny (Nvidia).
Jestem trochę zaskoczony tym, że skalowanie zajmuje tyle czasu. Sposób, w jaki to zrozumiałam, bitmapę (niezależnie od jej rozmiaru) jest ładowana jako tekstura Direct3D, a następnie skalowana sprzętowo. W rzeczywistości, po renderowaniu bitmapy po raz pierwszy, mogę zmienić jej rotację i skalę bez żadnych dalszych zawieszania.