2010-04-23 12 views
9

Buduję więc aplikację WPF i dzisiaj zrobiłem testowe wdrożenie, stwierdziłem, że działa ona bardzo słabo. Byłem zaskoczony, ponieważ tak naprawdę nie robimy zbyt wiele na temat efektów wizualnych lub animacji.WPF: Zwiększanie wydajności pracy na starszych komputerach

Zainstalowałem na dwóch komputerach: najszybszym i najwolniejszym, który będzie musiał uruchomić aplikację (najwolniejszy komputer ma Intel Celeron 1,80 GHz z 2 GB pamięci RAM). Aplikacja działała całkiem dobrze na szybszym komputerze, ale była wolniejsza od wolniejszej maszyny. A kiedy mówię "niepewny", mam na myśli, że kursor skoczył nawet po prostu przesuwając go przez otwarte okno aplikacji, która się skupiła.

Otworzyłem okno Task Manager Wydajność, a widział, że użycie procesora podskoczył, gdy aplikacja miała skupić i kursor porusza się nad nim. Jeśli skupiłem się na innym (np. W programie Excel), użycie procesora ponownie zmniejszyło się po chwili. Stało się tak na obu maszynach, ale chrupkość była zauważalna tylko na wolniejszym komputerze. Miałem bardzo ograniczony czas na majsterkowanie na maszynach do wdrażania, więc nie wykonałem wielu szczegółowych testów.

Aplikacja działa poprawnie na moim komputerze deweloperskim, ale widzę też CPU wybijanie do 10% tam, po prostu działa kursor nad oknem.

Pobrałem wydajne narzędzie WPF z MS i zostały majstrować przy nim (na moim komputerze dev). Docs powiedzieć o „Frame rate” metrycznego w narzędziu Perforator:

Do zastosowań bez animacji, wartość ta powinna być blisko 0.

Aplikacja nie robi żadnych ciężkich animacji ale szybkość klatek pozostaje blisko 50, kiedy kursor znajduje się nad dowolnym oknem. Ekrany, na których testowałem, mają nagłówki kolumn w siatce, która "podświetla" i przyciski, które zmieniają kolor i wygląd po przewinięciu. Nawet przesuwanie myszy na puste obszary okien powoduje taką samą liczbę klatek na sekundę i użycie procesora (nie wydaje się być związana z tymi mniejszymi animacjami).

(Nie jestem również w stanie dowiedzieć się, jak uzyskać tylko dwa domyślne narzędzia - Perforator i Visual Profiler - zainstalowane w narzędziu wydajności WPF.) To prawdopodobnie osobne pytanie).

Mam też narzędzia profilowania RedGate, ale nie jestem pewien, czy to może rzucić jakieś światło na wydajność renderowania.

Tak, zdaję sobie sprawę, że nie jest to łatwa rzecz rozwiązywania problemów bez specyfiki lub przykładowy kod (który nie mogę Post). Moje pytania to:

  • Co kilka ogólnych rzeczy szukać (albo unikać) w kodzie, aby poprawić wydajność?
  • Jakie kroki mogę podjąć pomocą funkcji wydajności WPF do zawężenia problemu ?
  • Czy powyższa specyfikacja komputera (Intel Celeron 1,80 GHz z 2 GB pamięci RAM) jest zbyt wolna, aby można było uruchamiać nawet aplikacje WPF?

Odpowiedz

3

Czy stosujesz jakieś BitmapEffect -s do swoich elementów interfejsu użytkownika? Nie są obsługiwane przez GPU, więc CPU zajmuje się ich renderowaniem. Jeśli nie zostanie zastosowane poprawnie (np. Przy zastosowaniu elementu OuterGlowBitmapEffect zastosowanego do dużego złożonego elementu), może to mieć straszny wpływ na wydajność.

Możesz także spróbować profilować swoją aplikację za pomocą profilera wydajności. Wystarczy sprawdzić, czy to nie twój kod to powoduje.

0

To nie jest normalne dla WPF - podejrzewam, że jeden z twoich programistów napisał kod, który uruchamia timer w tle (lub bardziej prawdopodobny, biorąc pod uwagę twój opis, program obsługi ruchu myszy), który wpływa w pewien sposób na interfejs użytkownika .

Jeśli masz profilera wydajności ANTS (to naprawdę miłe), uruchomiłbym to przez twoją aplikację i odtworzyć problem.

Po wykonaniu tej czynności ANTS powinien dość szybko wyjaśnić, na czym polega problem. Jeśli ANTS nie ujawni niczego i pokaże, że w rzeczywistości żaden z twoich kodów nie działa w tym czasie, to podejrzewam, że są to błędne sterowniki karty graficznej.

można przetestować za to przez wyłączenie akceleracji sprzętowej, ustawiając następujący klucz rejestru i próbuje ponownie:

HKEY_CURRENT_USER\Software\Microsoft\Avalon.Graphics\DisableHWAcceleration to 1 

Uwaga: wartość DisableHWAcceleration powinny być DWORD

Powiązane problemy