2012-08-24 5 views
6

Potrzebuję przyspieszyć moją przeglądarkę obrazów i zastanawiam się, czy powinienem zastanowić się nad stworzeniem własnego kontrolera DirectX, aby to zrobić.Natywny WPF w porównaniu z Custom DirectX do wyświetlania dużych obrazów

Moja przeglądarka obrazów wyświetla obrazy medyczne. Mogą być dość duże. Mówimy o 55 MB, jeśli chodzi o mammografię. Dane pikselowe to 16-bitowa skala szarości przechowywana w tablicy ushort. Bez wchodzenia w szczegóły, moje obecne podejście polega na ładowaniu danych pikseli do źródła obrazu i użyciu kontrolki obrazu WPF.

Nigdy nie robiłem nic z DirectX. Czy warto w nią nurkować? Czy byłoby to szybsze niż natywne rzeczy WPF? Jeśli tak, to jak bardzo? Czy powinienem po prostu zapomnieć o DirectX i zajrzeć do obszarów, w których mogę poprawić moje obecne podejście?

Zanim ktoś powie tak, wiem, że WPF wykorzystuje DirectX. Zastanawiam się, czy usunięcie warstwy WPF i napisanie DirectX sam poprawi wydajność.

+0

Czy jesteś pokazując cały obraz lub tylko jej części. W przypadku korzystania z ScrollViewer, to tylko to, czego potrzebujesz ładuje do pamięci –

+0

@JustinPihony wyświetlania całego obrazu. –

+1

wystarczy pamiętać directx! = Directx. Zależy to również od używanego opakowania bezpośredniego.Zwykle SlimDX lub sharpdx ma lepszą wydajność niż Xna lub Managed DirectX. Ale w sumie nie wydaje mi się, że osiągasz znacznie lepsze wyniki. –

Odpowiedz

3

Mam doświadczenie w rysowaniu zdjęć satelitarnych i wykresów z wieloma gigabajtami. Praca z obrazami o rozmiarze około 55 MB powinna prawdopodobnie działać dobrze nawet bez prób jej optymalizacji. Nie podałeś wystarczająco dużo szczegółów, aby polecić jedną alternatywę względem drugiej, więc przedstawię moją opinię na temat zalet i wad.

Korzystanie okna 2D API będzie najprostsze do wdrożenia i zawsze powinny być wystarczająco szybki, jeśli nie trzeba obracać i po prostu chcą, aby wyświetlić obraz i powiększać i przesuwać wokół. Jeśli potraktujesz to jako jeden duży obraz, wydajność nie będzie tak dobra, gdy zmniejszysz, jeśli rysujesz z półtonem, aby uzyskać ładny, gładki obraz. Dzieje się tak dlatego, że za każdym razem, gdy pobierze, będzie musiał odczytać wszystkie 55 MB obrazu.

Aby obejść ten problem z wydajnością, można utworzyć wiele map bitowych, skutecznie mapując obraz na mip. Podczas zmniejszania możesz wybrać obraz o zmniejszonej rozdzielczości, który jest najbliższy rozdzielczości, którą próbujesz narysować. Jeśli nie są zaznajomieni z MIP-mapping tu jest link Wikipedia:

http://en.wikipedia.org/wiki/Mipmap

Wdrożenie go z DirectX będzie 10x jako trudne. Różne elementy graficzne mają różne maksymalne rozmiary tekstur. Najprawdopodobniej będziesz musiał złamać obraz w wielu teksturach do rysowania, a będziesz musiał także śledzić stany renderowania, wyświetlać matryce itp.

Jeśli jednak używasz DirectX, możesz wdrożyć wiele Korekty zdjęć w czasie rzeczywistym Możesz obracać w czasie rzeczywistym, po prostu dostosowując matryce widoku. Można to zrobić w czasie rzeczywistym, kontrast, jasność, gamma, ostrość i łatwo w pixel shader.

Są dwa inne API, które mogę zasugerować. Jeśli chcesz ograniczyć się do systemu Vista lub nowszego, Direct2D będzie nieco prostszy niż Direct3D. Także jeśli kiedykolwiek będziesz musiał zaimplementować to na platformie non-windows, sugerowałbym użycie OpenGL. Mój obecny projekt jest w Direct3D, ponieważ kilka lat temu, kiedy go uruchomiliśmy, OpenGL pozostało w tyle i nie przewidziałem popularności urządzeń z Androidem. Żałuję teraz, że nie skorzystaliśmy z OpenGL.

1

Wypróbuj profiling, aby sprawdzić, gdzie spędza czas WPF. Czy wyświetlasz obrazy w ich macierzystej rozdzielczości? Jeśli nie, warto przeprowadzić wstępną obróbkę i utworzyć wersje o rozdzielczości 1/2.

Powiązane problemy