2012-01-11 14 views
18

Tenemos una aplicación C# WPF escrita en .NET 4.0, que tiene un enlace de datos relativamente simple y funcionalidad de red.WPF C# Application Performance

El diseño implica algunos "ajustes", incluidos algunos colores de vuelo estacionario, etc.

En 3 máquinas, de una implementación que cubre 20, estamos experimentando algunos problemas de rendimiento muy extraños con la interfaz de usuario.

Efectivamente, después de un reinicio, la aplicación funciona bien, pero después de un cierto tiempo (indeterminado), la interfaz de usuario se vuelve increíblemente lenta. Por ejemplo, colocando el mouse sobre un botón, y habrá un retraso de hasta un par de segundos antes de que se aplique/renderice el estilo de color.

Las máquinas tienen especificaciones casi idénticas. Los controladores de gráficos se han actualizado y la configuración estándar es de dos tarjetas NVidia Quadro 290. Complementariamente, hicimos una aplicación de "prueba" que contenía SOLAMENTE algunos componentes de UI de prueba (incluida la cinta Fluent Ribbon) y ningún código detrás. El problema aún ocurre

He ejecutado el Windows Performance Suite para 'profundizar' en el WPF en tiempo de ejecución, y, curiosamente, la UI vuelve a la capacidad de respuesta normal si la opción 'Desactivar compatibilidad con regiones sucias' está marcada. Mi comprensión es que, en todo caso, ¡esto debería disminuir el rendimiento aún más!

No tengo nada más que probar aquí. Un análisis de rendimiento de DotTrace sugiere que la mayor parte del tiempo de la aplicación se gasta en PresentationFramework.dll.

[EDITAR] Todas las máquinas son Windows XP SP3.

[EDIT] Es posible que esto ocurra en todas las máquinas y que la aplicación no se pueda ejecutar durante el tiempo suficiente como para presentar el problema. Estamos probando esto ahora.

[EDIT] Debo señalar también que estamos experimentando con la revisión detallada here. Se ha instalado en una sola máquina por el momento, y actualizaré en consecuencia.

[EDITAR - 24 horas después] Por lo tanto, dos máquinas han estado utilizando el mismo código durante la noche. En mi máquina (que nunca ha demostrado el problema), después del inicio de sesión inicial la aplicación era muy lenta, pero después de menos de un minuto volvía a la normalidad. (Lo puse en la máquina claramente sacando cosas de la HDD). En la otra máquina (que generalmente demuestra el problema), la aplicación mejoró después de algunos segundos, pero todavía es lenta en comparación con la mía.

[EDIT - 48 horas más tarde] En la máquina de prueba, la aplicación de prueba es ahora totalmente insensible (bloqueado) después de correr durante 48 horas. En la misma máquina, una aplicación WPF 'shell' liviana (que contiene un control de pestañas, algunos botones y algunos paneles y rejillas) sigue funcionando y responde perfectamente. Entonces, algo en estos controles más complejos está causando este problema ... lo que de hecho apunta a desencadenantes (potencialmente) y delega que podría ser la causa raíz. Buscaré un perfil de la aplicación/controles nuevamente. Mientras tanto, ¿alguien tiene algún consejo sobre cómo asegurarse de que la aplicación se "limpia" después de sí misma a intervalos regulares? ¡Porque estamos viendo controles de terceros aquí, así que mis opciones para editarlos son limitadas!

¡Agradecería cualquier consejo que pueda proporcionarse!

+0

¿Es posible proporcionar el código? Algún otro SO'er probablemente también quisiera probar esto. ¿Cuánto tiempo es la menor cantidad de tiempo antes de que aparezcan los problemas? – Default

+0

Puedo proporcionar el código si es necesario ... pero nuestra aplicación de prueba por el momento literalmente implica el uso ÚNICAMENTE de una cinta fluida (descargable desde CodePlex), en una cuadrícula vacía. No hay código detrás aparte de la llamada de inicio obvia. Por supuesto, proporcionaré esto comprimido si eso hiciera la vida más fácil. – Nick

+0

No esperes mucho de un sistema prototipo. Como primer paso verificaría el uso de los delegados. ¿Usas el a menudo? –

Respuesta

2

intenta reproducir wpf en modo de software.

en el evento Loaded:

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

He intentado esto. Debo señalar que el problema persiste durante el reinicio de una aplicación. Por lo tanto, si es lento, intenté volver a crearlo con el indicador SoftwareOnly, desplegándolo en la máquina de destino, y todavía es lento. ¡Solo un reinicio garantiza una mejora! – Nick

+0

¿Fluent Ribbon utiliza ventanas en capas? ver: 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

quizás jugando con algunas configuraciones de registro: http://msdn.microsoft.com/en-us/library/aa970912.aspx – c0d1ng

1

Algo a tener en cuenta al comparar el rendimiento entre las máquinas de usuarios y desarrolladores es el tiempo que tarda en cargar los ensamblados de WPF.

En una máquina de desarrollo, es posible que ya tenga visual studio ejecutándose o que haya ejecutado anteriormente otras aplicaciones WPF y que todos los ensamblajes se hayan cargado antes de ejecutar la aplicación.

En una máquina de usuario, tal vez recién reiniciado, los ensamblajes se cargarán cuando la aplicación se inicie, lo que hará que el arranque sea mucho más lento. Dependiendo de cómo esté configurada la aplicación, pueden cargarse ensamblajes adicionales cuando se usan varias características/páginas por primera vez.

He encontrado que el EQUATEC profiler es útil en la depuración de estos problemas de rendimiento. Al cambiar el perfil a "Información completa habitual" en las opciones de la aplicación antes de crear su proyecto, el perfil se reducirá al nivel de enlace.

+1

Realmente no creo que esto tenga que ver con el tiempo de inicio y los ensamblados precargados. Esto es de larga duración en términos de ciclo de vida de la aplicación. He investigado varios problemas relacionados con el inicio como se menciona en http://blogs.msdn.com/b/jgoldb/archive/2007/10/10/improving-wpf-applications-startup-time.aspx – Nick

+0

Además, he corrido Procmonee junto a la aplicación y observe que no se cargan archivos durante el funcionamiento normal (y mientras la interfaz de usuario está rezagada). ¡Definitivamente voy a darle una oportunidad al generador de perfiles de EQUATEC! – Nick

+0

Gracias por el enlace, muchas cosas que me he estado preguntando por ahí (por ejemplo, "colocar Ensambles de nombres fuertes en el GAC" para un inicio más rápido) – Skrealin