2010-02-25 10 views
9

Chcę renderować wiele okręgów lub małych grafik w ramach silverlight lub wpf (około 1000-10000) tak szybko i tak często, jak to możliwe. Jeśli mam iść do DX lub OGL, to jest w porządku, ale zastanawiam się nad zrobieniem tego w ramach jednej z tych dwóch frameworków jako pierwszej (czytaj: jest OK, jeśli odpowiedź jest tylko typu WPF lub Silverlight). Ponadto, jeśli istnieje sposób dostępu do DX przez WPF i renderowania na powierzchni w ten sposób, byłbym również zainteresowany tym.C#/Silverlight/WPF/Szybkie renderowanie wiele okręgów

Jaki jest więc najszybszy sposób na załadowanie kręgów? Mogą być tak proste, jak to konieczne, ale muszą mieć promień. Obecnie używam polecenia DrawingVisual i DrawingContext.DrawEllipse() dla każdego kręgu, a następnie renderowania wizualnego do RenderTargetBItmap, ale staje się bardzo powolny, gdy liczba kół wzrasta.

Nawiasem mówiąc, te kółka przesuwają każdą klatkę, więc buforowanie nie jest tak naprawdę opcją, chyba że sugerujesz buforowanie poszczególnych okręgów. . . Ale ich rozmiary są dynamiczne, więc nie jestem pewien, czy to świetne podejście.

+1

Po prostu ciekawy, dlaczego twój rysunek ma 10000 dynamicznych kółek? – NotDan

+0

To jest gra. Wszystkie mogą rosnąć i kurczyć się i co tam. –

+0

Uwaga, edytując, nie otrzymuję żadnej własności tego pytania. Ponadto trend na SO polega na tym, że ** nie ** ma pozdrowienia (np. "Cześć", "cześć", "Mam nadzieję, że możesz mi pomóc") lub podpisy (np. "-Walt W"). Aby uzyskać więcej informacji, zobacz post na Meta StackOverflow w związku z tym: http://meta.stackexchange.com/questions/28416/what-is-the-policy-on-signatures-and-links-in-answers-for-stack -overflow-question – casperOne

Odpowiedz

6

Wyjazd this article przez Charles Petzold. Opisuje, jak zrobić dokładnie to, czego szukasz.

+0

To może zadziałać, chociaż trochę się waham, aby ponownie wprowadzić moje kręgi jako dział rozproszeń punktów, które, jak sądzę, byłyby zoptymalizowane pod kątem zawartości statycznej, w przeciwieństwie do dynamicznej zawartości, o której mówię. –

+0

Myślę, że przegapiłeś ten punkt. Artykuł nie dotyczy tak naprawdę działki rozproszonej, chodzi o powszechne sposoby przyspieszenia wyświetlania wielu prostych elementów w WPF i potencjalnych pułapek po drodze. –

+0

Widzę, o co ci chodzi; przepraszam, wcześniejszy wygląd był dość szybki. Popatrzę na to więcej. –

5

W Silverlight 3.0+ najprawdopodobniej użyjesz WriteableBitmap do tego. W WPF może to być również dobry wybór.

Napisałem dwie aplikacje demonstracyjne w Silverlight. Mogą być trochę powikłani, ale demonstrują to.

  1. Hello world application. Zdecydowanie można zoptymalizować. Wydajność nie jest dobra, ale dlatego, że zrobiłem coś głupiego. Uważam, że ma ~ 2 500 elipsy:

alt text http://img42.imageshack.us/img42/5629/helloworld.jpg

  1. Slide show application. Nie mogę sobie przypomnieć liczbę obiektów, ale to jest bardziej niż 10 000.

alt text http://img11.imageshack.us/img11/5264/slideshowa.jpg

+0

Zastanawiam się, czy można powiedzieć "dużo więcej" po angielsku. Jeśli to głupie, miałem na myśli o wiele więcej :). – Anvaka

+0

o wiele więcej utworów :) Spojrzę na nie, ale szukam dość wysokich klatek na sekundę, i wygląda na to, że zajmuje sekundę na klatkę dla 2500 elips. –

+0

Dziękuję :). Drugi to nie jest framerate. To czas inicjalizacji. Framerate jest dość wysokie. Bez zamrożenia, bez skakania, wszystko gładkie. – Anvaka

4

Zapoznaj się z WriteableBitmapEx library dla Silverlight, który na pewno będzie działał również z WPF. Funkcję koła wprowadzono do wnętrza obiektu this blog post, w tym próbkę.

+0

Pytanie o to - czy wspiera wypełnianie kształtów? Widzę tylko zarysy w pokazach. –

+0

Co może nie być tak źle, jak notatka, ale byłem ciekawy. –

+0

W tej chwili nie ma wsparcia dla wypełnienia, ale znajduje się na liście i zostanie wdrożony w najbliższej przyszłości. Chociaż mam też wiele innych projektów. :) –

2

Jeśli chcesz prędkości, nie używaj rysowania Elipsa - pre generuj swoje kółka dla rozmiarów i kolorów i użyj zapisu bitmapy, a dostaniesz pełną akcelerację BitBlt.

Może to być trudne w zależności od tła, potrzeb w zakresie przezroczystości lub antyaliasingu, ale będzie szybciej rosnąć rząd wielkości.

Używanie antyliniowanego rysunku linii jest powolne, ale jest w porządku dla większości thigs, ponieważ odesnt zmiany wyniki mogą być buforowane i otrzymujesz wiele ramek z wynikiem.

Jeśli jednak chcesz rysować tak szybko, jak to możliwe, użyj nieprzezroczystych bitmap.

2

Podczas gdy już zaakceptowałeś odpowiedź, jeśli potrzebujesz użyć DirectX9 (współpraca z nowszymi wersjami jest nieco trudniejsza, ale wciąż można to zrobić (w zależności od sprzętu)) możesz użyć komponentu D3DImage. Które jest szczegółowo opisane w CodeProject Here.

Inną opcją jest użycie kontrolki WinForms i użycie hWnd tego dla tworzenia urządzenia D3D.

Powiązane problemy