2010-04-23 4 views
9

Così, sto costruendo un'app WPF e ho fatto una distribuzione di prova oggi, e ho scoperto che si comportava in modo piuttosto scadente. Sono rimasto sorpreso, perché non stiamo facendo molto in termini di effetti visivi o animazioni.WPF: Miglioramento delle prestazioni per l'esecuzione su vecchi PC

Sono distribuito su due computer: il più veloce e il più lento necessario per eseguire l'applicazione (il PC più lento ha un Intel Celeron a 1,80 GHz con 2 GB di RAM). L'applicazione funzionava piuttosto bene con la macchina più veloce, ma era troppo veloce sulla macchina più lenta. E quando dico "choppy", intendo che il cursore è saltato anche solo passandolo sopra una finestra aperta dell'app che ha messo a fuoco.

Ho aperto la finestra Prestazioni di Task Manager e ho notato che l'utilizzo della CPU è saltato ogni volta che l'app aveva il focus e il cursore si stava muovendo su di esso. Se ho focalizzato l'attenzione su un altro (ad esempio, Excel), l'utilizzo della CPU è diminuito dopo un secondo. Ciò è accaduto su entrambe le macchine, ma il choppiness era visibile solo sulla macchina più lenta. Ho avuto un tempo molto limitato per provare le macchine di distribuzione, quindi non ho fatto molti test dettagliati.

L'app funziona correttamente sul mio computer di sviluppo, ma vedo anche che la CPU raggiunge il 10%, spostando semplicemente il cursore sulla finestra.

Ho scaricato lo strumento di prestazioni WPF da MS e ho lavorato su di esso (sulla mia macchina di sviluppo). La documentazione dicono che questo circa la "Frame Rate" metrica nello strumento perforatore:

Per le applicazioni senza animazione, questo valore dovrebbe essere vicino a 0.

L'applicazione non sta facendo alcuna animazione pesante, ma il frame rate rimane vicino a 50 quando il cursore si trova su una finestra qualsiasi. Le schermate che ho testato hanno intestazioni di colonna in una griglia che "evidenziano" e pulsanti che cambiano colore e aspetto quando si scorre. Anche spostare il mouse su aree vuote delle finestre causa la stessa frequenza di frame e l'utilizzo della CPU (non sembra essere correlato a queste animazioni minori).

(Inoltre, non riesco a capire come ottenere nulla tranne i due strumenti predefiniti - Perforator e Visual Profiler - installati nello strumento delle prestazioni di WPF. Questa è probabilmente una domanda separata).

Ho anche lo strumento di profilazione di Redgate, ma non sono sicuro che ciò possa far luce sul rendering delle prestazioni.

Quindi, mi rendo conto che non è una cosa facile da risolvere senza specifiche o codice di esempio (che non posso pubblicare). Le mie domande sono:

  • Quali sono alcune cose generali da cercare per (o evitare) nel codice per migliorare le prestazioni ?
  • Quali operazioni posso eseguire utilizzando lo strumento delle prestazioni WPF per limitare il problema ?
  • Le specifiche del PC sopra elencate (Intel Celeron 1.80 GHz con 2 GB di RAM) sono troppo lente per l'esecuzione anche di applicazioni WPF vaniglia?

risposta

3

Stai applicando uno qualsiasi BitmapEffect -s ai tuoi elementi dell'interfaccia utente? Non sono gestiti dalla GPU, quindi la CPU si occupa di renderli. Se non utilizzati correttamente (ad esempio se OuterGlowBitmapEffect è applicato a un elemento complesso di grandi dimensioni) possono avere un impatto terribile sulle prestazioni.

Inoltre, potresti ancora provare a profilare la tua app con un profiler delle prestazioni. Solo per vedere se non è il tuo codice a causare questo.

0

Questo non è normale per WPF - sospetto che uno dei tuoi sviluppatori abbia scritto codice che esegue un timer in background (o più probabilmente dato la tua descrizione, un gestore di spostamento del mouse) che sta interessando l'interfaccia utente in qualche modo .

Se disponi di un profiler delle prestazioni ANTS (è davvero bello) lo eseguirò sulla tua app e riprodurrò il problema.

Una volta che hai fatto, ANTS dovrebbe dirti abbastanza velocemente qual è il problema. Se ANTS non rivela nulla e ti mostra che in realtà nessuno del tuo codice è in esecuzione durante questo periodo, allora sospetto driver di scheda grafica difettosi.

È possibile verificare questa disabilitando l'accelerazione hardware impostando la seguente chiave del Registro di sistema e riprovare:

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

Nota: il valore DisableHWAcceleration dovrebbe essere un DWORD