2012-01-11 17 views
18

Abbiamo un'applicazione C# WPF scritta in .Net 4.0, che presenta alcuni semplici collegamenti dati e funzionalità della griglia.Prestazioni dell'applicazione WPF C#

Lo stile elabora alcune "modifiche", inclusi alcuni colori di passaggio del mouse e così via.

Su 3 macchine, al di fuori di una copertura di distribuzione 20, stiamo riscontrando alcuni problemi di prestazioni molto strani con l'interfaccia utente.

In effetti, dopo un riavvio l'applicazione si comporta bene, ma dopo un certo periodo di tempo (non determinato), l'interfaccia utente diventa incredibilmente fiacca. Ad esempio, passando il mouse sopra un pulsante, si verificherà un ritardo di un paio di secondi prima che lo stile del colore al passaggio del mouse venga applicato/reso.

Le macchine hanno specifiche quasi identiche. I driver grafici sono stati aggiornati e l'impostazione starndard è di due schede NVidia Quadro 290. Additivamente, abbiamo creato un'applicazione "test" contenente SOLO alcuni componenti dell'interfaccia utente di test (incluso il nastro Fluent) e nessun codice. Il problema si verifica ancora.

Ho eseguito Windows Performance Suite per "approfondire" il WPF di runtime e, molto stranamente, l'interfaccia utente ritorna alla normale reattività se l'opzione "Disattiva supporto area sporca" è spuntata. La mia comprensione è che, se mai, questo dovrebbe diminuire ulteriormente le prestazioni !!!

Sono a corto di qualsiasi altra cosa da provare qui. Un'analisi delle prestazioni di DotTrace suggerisce che la maggior parte del tempo di applicazione viene speso in PresentationFramework.dll.

[EDIT] Tutte le macchine sono Windows XP SP3.

[EDIT] È possibile che ciò si verifichi su tutte le macchine e che di solito l'applicazione non venga eseguita per un tempo sufficiente a presentare il problema. Lo stiamo testando ora.

[EDIT] Vorrei anche sottolineare che stiamo sperimentando l'aggiornamento rapido dettagliato here. È stato installato su una singola macchina per il momento e aggiornerò di conseguenza.

[EDIT - 24 ore dopo] Quindi due macchine hanno eseguito lo stesso codice durante la notte. Sulla mia macchina (che non ha mai dimostrato il problema), dopo il primo accesso l'applicazione è stata molto lenta, ma dopo meno di un minuto è tornata alla normalità. (L'ho messo giù sulla macchina, eliminando chiaramente l'HDD). Sull'altra macchina (che di solito dimostra il problema), l'applicazione è migliorata dopo pochi secondi, ma è ancora lenta rispetto alla mia.

[EDIT - 48 ore più tardi] Sulla macchina di prova, l'applicazione di test è ora completamente non risponde (bloccato) dopo l'esecuzione per 48 ore. Sulla stessa macchina, un'applicazione WPF 'shell' leggera (contenente un controllo struttura a schede, alcuni pulsanti e alcuni pannelli e griglie) è ancora in esecuzione e perfettamente reattiva. Quindi qualcosa in questi controlli più complessi sta causando questo problema ... che in effetti punta a (potenzialmente) trigger e delegati che potrebbero essere la causa principale. Cercherò di nuovo profilo dell'applicazione/controlli. Nel frattempo qualcuno ha qualche consiglio su come assicurarsi che l'applicazione "ripulisca" se stessa a intervalli regolari? Perché stiamo guardando i controlli di terze parti qui, quindi le mie opzioni per modificarle sono limitate!

Apprezzerebbero eventuali suggerimenti che possono essere forniti!

+0

È possibile fornire il codice? qualche altro SO vorrebbe probabilmente provare anche questo. Quanto è lungo il tempo prima che i problemi vengano visualizzati? – Default

+0

Posso fornire il codice se necessario ... ma la nostra applicazione di test al momento richiede letteralmente l'utilizzo SOLO di una Fluent Ribbon (scaricabile da CodePlex), in una griglia vuota. Non c'è alcun codice dietro a parte l'ovvia chiamata di init. Ovviamente fornirò questo zippato se renderà la vita più facile. – Nick

+0

Non aspettarti molto da un sistema prototipo. Come primo passo controllerei l'utilizzo dei delegati. Usi spesso? –

risposta

2

tenta di rendere wpf in modalità software.

nell'evento caricati:

HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource; 
HwndTarget hwndTarget = hwndSource.CompositionTarget; 
hwndTarget.RenderMode = RenderMode.SoftwareOnly; 
+0

Ho provato questo. Devo sottolineare che il problema persiste durante il riavvio dell'applicazione. Quindi, se è lento, ho provato a reubuilding con il flag SoftwareOnly, distribuendolo sul computer di destinazione, ed è ancora lento. Solo un riavvio garantisce un miglioramento! – Nick

+0

Fluent Ribbon usa finestre a strati? vedere: http://blogs.msdn.com/b/seema/archive/2006/09/18/761314.aspx http://blogs.msdn.com/b/seema/archive/2007/07/ 02/hw-acceleration-of-layered-windows-good-news.aspx – c0d1ng

+0

forse giocando con alcune impostazioni del Registro di sistema: http://msdn.microsoft.com/en-us/library/aa970912.aspx – c0d1ng

1

Qualcosa da considerare quando si confrontano le prestazioni tra le macchine di sviluppatori e utenti è il tempo necessario per caricare gli assembly WPF.

Su una macchina di sviluppo è possibile che Visual Studio sia già in esecuzione o che in precedenza siano state eseguite altre app WPF e che tutti gli assembly siano stati caricati al momento dell'esecuzione della app.

Su una macchina utente, probabilmente appena riavviata, gli assiemi verranno caricati all'avvio dell'app, rallentando notevolmente l'avvio. A seconda di come è configurata l'app, potrebbero esserci carichi aggiuntivi durante il caricamento di varie funzioni/pagine per la prima volta.

Ho trovato che lo EQUATEC profiler è utile per il debug di questi problemi di prestazioni. Cambiando il profilo in "Informazioni normali complete" nelle opzioni dell'app prima di costruire il tuo progetto, il profilo si ridurrà al livello di binding.

+1

Non credo che questo sia dovuto al tempo di avvio e agli assembly precaricati. Si tratta di una lunga corsa in termini di ciclo di vita delle applicazioni. Ho esaminato vari problemi relativi all'avvio come menzionato su http://blogs.msdn.com/b/jgoldb/archive/2007/10/10/improving-wpf-applications-startup-time.aspx – Nick

+0

Inoltre, ho eseguito Procmon accanto all'applicazione e non ha notato il caricamento di file durante il normale funzionamento (e mentre l'interfaccia utente è in ritardo). Darò comunque il profiler EQUATEC comunque! – Nick

+0

Grazie per il link, molte cose di cui mi stavo chiedendo (ad esempio "collocare Assemblati con Strong-Named in GAC" per l'avvio più veloce) – Skrealin