2012-01-03 14 views
19

Tworzę program odwzorowujący WPF, który potencjalnie może załadować i narysować setki plików na ekranie w tym samym czasie, a użytkownik może chcieć powiększyć i przesunąć ten ekran. Niektóre z tych typów plików mogą zawierać tysiące punktów, które najprawdopodobniej będą połączone jako ścieżka. Inne obsługiwane formaty będą zawierać pliki TIFF.Wysoka wydajność grafiki przy użyciu warstwy wizualnej WPF

Czy lepiej jest, aby wydajność miała jedną wersję DrawingVisual, do której rysowane są wszystkie dane, czy też powinienem utworzyć nowy rysunek DrawingVisual dla każdego załadowanego pliku?

Jeśli ktokolwiek może zaoferować jakąkolwiek poradę, byłby to bardzo cenne.

+2

Brzmi to pokrewnie, ale może nie do końca, co chcesz: [Microsoft Deep Zoom] (http://msdn.microsoft.com/en-us/library/cc645050 (v = vs.95) .aspx) – Ray

Odpowiedz

32

znajdziesz wiele powiązanych pytań dotyczących Stack Overflow, jednak nie wszystkie z nich wspominają, że jednym z najbardziej wydajnych sposobów na pobieranie dużych ilości danych na ekran jest użycie interfejsu API WriteableBitmap. Proponuję rzucić okiem na projekt open source na codepleksie WriteableBitmapEx. Ujawnienie, przyczyniłem się do tego jeden raz, ale to nie jest moja biblioteka.

Eksperymentując z DrawingVisual, StreamGeometry, OnRender, Canvas, wszystkie te elementy przewrócą się, gdy będziesz musiał narysować ponad 1000 "obiektów" na ekranie. Istnieją techniki radzenia sobie z wirtualizacją płótna (istnieje "million items demo z wirtualizowanym płótnem"), ale nawet to jest ograniczone do ~ 1000 widocznych w tym samym czasie przed spowolnieniem. WriteableBitmap umożliwia bezpośredni dostęp do bitmapy i rysowanie jej (styl oldskool), co oznacza, że ​​możesz rysować dziesiątki tysięcy obiektów z dużą prędkością. Możesz zaimplementować własne optymalizacje (wielowątkowość, poziom szczegółowości), ale pamiętaj, że dzięki temu API nie uzyskasz zbyt wielu dodatków. Dosłownie robisz to sam.

Jest jednak jedno zastrzeżenie. Podczas gdy WPF używa procesora do tesselation/GPU do renderowania, WriteableBitmap użyje CPU na wszystko. Dlatego stopień wypełnienia (liczba pikseli renderowanych na klatkę) staje się wąskim gardłem w zależności od mocy procesora.

Jeśli to nie pomoże, jeśli naprawdę potrzebujesz renderowania wysokiej wydajności, proponuję przyjrzeć się SharpDX (Managed DirectX) i współdziałaniu z WPF. Zapewni to najwyższą wydajność, ponieważ będzie bezpośrednio korzystać z GPU.

poważaniem,

+0

Dzięki , to jest interesujące. Wolałbym jednak używać grafiki WPF, jeśli to możliwe, ponieważ wcześniej tworzyłem programy GIS przy użyciu GDI + i wolałbym teraz spróbować czegoś, co korzysta z GPU. Kiedy mówisz "obiekty", masz na myśli obiekty wizualne, lub powiesz kilka linii w jednym obrazie jako kilka obiektów? – Greg

+0

Witaj Greg, gdy mówiłem, że obiekty mam na myśli, renderowane przez grafikę GDI lub WPF itd. ... Odnośnie akceleracji GPU wpf, cały ten wzrost wydajności i więcej jest tracony przez układ strony procesora i tesselację. Proszę zobaczyć moją stronę tutaj http://goo.gl/1nCpw dla demonstracji tego, co może zrobić podejście bitmapowe i porównać z innymi podobnymi komponentami tutaj http://goo.gl/ohLFj osiągnąć z prymitywami renderowania wpf. –

+0

Oto [pytanie] (http://stackoverflow.com/questions/22599806/speeding-up-an-l-system-renderer-in-c-wpf/22727519?noredirect=1#comment34646163_22727519) gdzie WriteableBitmapEx wiele rzeczy zrobiło szybciej. – dharmatech

10

użyciu wielu małych DrawingVisuals z kilkoma szczegółami świadczonych za wizualny dał lepszą wydajność w porównaniu do mojego doświadczenia mniej DrawingVisuals więcej szczegółów świadczonych za wizualny. Odkryłem również, że usunięcie wszystkich elementów wizualnych i renderowanie nowych elementów wizualnych przebiegło szybciej niż ponowne wykorzystanie istniejących efektów wizualnych, gdy wymagane było odświeżenie. Łamanie każdej mapy na wiele elementów wizualnych może pomóc w osiągnięciu wydajności.

Tak jak w przypadku jakichkolwiek działań związanych z wydajnością, przeprowadzanie testów czasowych z wykorzystaniem własnych scenariuszy jest najlepszym sposobem, aby się upewnić.

+1

To jest lepsza odpowiedź w kontekście pierwotnego pytania. –

+0

Dzięki Repo Man. –

Powiązane problemy