Hay muchas veces en que más de un panel sería adecuado para el diseño que quiero, sin embargo, sé que hay una diferencia en los tiempos de renderizado para diferentes tipos de paneles.
Por ejemplo, MSDN establece que
Un sistema relativamente simple
Panel
, comoCanvas
, puede tener un rendimiento significativamente mejor que uno más complejoPanel
, comoGrid
.
Entonces, en términos de tiempo de procesamiento y rendimiento, ¿en qué orden los paneles WPF son los más eficientes?
Paneles WPF:
Canvas
DockPanel
Grid
UniformGrid
StackPanel
WrapPanel
VirtualizingPanel
/ /VirtualizingStackPanel
Estoy bastante seguro de que vi una lista de esto en algún lugar en línea, pero no puedo encontrarla ahora.
La respuesta ideal que estoy buscando me proporcionaría una lista de paneles en el orden en que se procesarían más rápido. Entiendo que el número de niños es un factor importante en la eficacia de los paneles, por lo que, en aras de esta pregunta, suponga que cada panel solo tiene un Label
/ TextBox
par.
Además, me gustaría una lista de excepciones, como paneles específicos que funcionan mejor que otros en ciertas condiciones.
Actualizar
Para resumir según la respuesta aceptada a continuación, el rendimiento del panel se basa en el número y la disposición de los elementos secundarios, sin embargo, en general, la lista de la más rápida a la más lenta es:
Canvas
StackPanel
WrapPanel
DockPanel
Grid
Además, siempre se debe usar un VirtualizingPanel
/ VirtualizingStackPanel
si hay muchos elementos que no siempre caben en la pantalla.
Le recomiendo que lea la respuesta aceptada a continuación para obtener más detalles antes de elegir un elemento de esta lista.
fuente
VirtualizingStackPanel
definitivamente funcionará mejor, pero si todos los elementos que se muestran en el panel son visibles, creo que es mejor usar un panel normal.Respuestas:
Creo que es más conciso y comprensible describir las características de rendimiento de cada panel que intentar dar una comparación de rendimiento relativa absoluta.
WPF realiza dos pases al representar contenido: Medir y Organizar. Cada panel tiene características de rendimiento diferentes para cada uno de estos dos pases.
El rendimiento del paso de medida se ve más afectado por la capacidad de un panel para acomodar el estiramiento usando alineaciones (o Auto en el caso del
Grid
) y luego el número de niños que se estiran o se ajustan automáticamente. El rendimiento del pase Organizar se ve afectado por la complejidad de la interacción entre la ubicación del diseño de los diferentes niños y, por supuesto, la cantidad de niños.A veces, los paneles dados no se prestan fácilmente al diseño necesario. Creé un control que necesitaba un número arbitrario de elementos para que cada uno se posicionara en un cierto porcentaje del espacio disponible. Ninguno de los controles predeterminados hace esto. Intentar hacer que hagan esto (mediante el enlace al tamaño real del padre) da como resultado un rendimiento horrible. Creé un panel de diseño basado en el lienzo que logró el resultado deseado con un trabajo mínimo (copié la fuente del lienzo y modifiqué alrededor de 20 líneas).
Paneles disponibles:
Lona
El lienzo tiene el mejor rendimiento de todos los paneles para el pase de organización, ya que a cada elemento se le asigna una ubicación estática. El paso de medida también tiene un rendimiento excelente ya que no hay un concepto de estiramiento en este panel; cada niño simplemente usa su tamaño nativo.
DockPanel
El Dockpanel tiene un esquema de diseño muy simple donde los elementos se agregan uno por uno en relación con el elemento agregado anteriormente. De manera predeterminada, la altura o el ancho están determinados por el tamaño nativo del elemento (basado en Superior / Inferior vs Izquierda / Derecha, respectivamente) y la
Dock
propiedad determina la otra dirección si el ancho o la altura no están definidos. Pase de medida medio a rápido y paso de arreglo medio a rápido.Cuadrícula
Este puede ser el panel con mayor rendimiento si se utiliza el tamaño proporcional o el tamaño automático. Calcular el tamaño del elemento secundario puede ser una combinación compleja del tamaño nativo del elemento y el diseño especificado por la cuadrícula. El diseño también es el más complicado de todos los paneles. Rendimiento lento a medio para el pase de medida y rendimiento lento a medio para el pase de arreglo.
StackPanel
El StackPanel mide a sus hijos utilizando el tamaño nativo o relativo en la dirección opuesta a su orientación y el tamaño nativo en la dirección de su orientación (la alineación no hace nada en esta dirección). Esto lo convierte en un artista de nivel medio en esta área. El pase de Arreglo es simple, simplemente colocando los elementos en orden. Probablemente la segunda mejor actuación para este pase. Rendimiento medio para el pase de medida y rendimiento rápido para el pase de diseño.
VirtualizingPanel
Una clase base para implementar su propio panel de virtualización. Solo carga elementos visibles para evitar el uso innecesario de memoria y procesador. MUCHO más eficaz para conjuntos de artículos. Probablemente un poco menos de rendimiento para los elementos que caben en la pantalla debido a la comprobación de límites. El SDK solo proporciona una subclase de esto, el
VirtualizingStackPanel
.WrapPanel
El paso de medida es un paso algo complejo donde el elemento más grande para una fila particular determina la altura de la fila y luego cada elemento en esa fila usa su altura nativa (si tiene una) o la altura de la fila. El pase de diseño es simple, coloca cada elemento uno tras otro en una fila y luego continúa en la siguiente fila cuando no hay suficiente espacio para el siguiente elemento. Medida de rendimiento medio aprobado. Rendimiento medio a rápido para el pase de arreglo.
Referencias
Desde la optimización del rendimiento: diseño y diseño
De medir y organizar niños
fuente
UniformGrid
en tu lista en ningún lado. ¿Sería capaz de actualizar su respuesta con ese panel y su rendimiento estimado de Medir / Organizar en relación con los otros tipos de panel?UniformGrid
no está diseñado para usarse en el diseño de la aplicación. Consulte "Elementos del panel derivados" aquí: msdn.microsoft.com/en-us/library/ms754152.aspx para obtener más información. En cuanto a la velocidad, debería ser un poco más rápido que ay unDockPanel
poco más lento que aCanvas
.Tal vez esto te ayude.
No solo para paneles sino también para cada aplicación que desee realizar en WPF.
Concluye el rendimiento de dibujo y medición de WPF.
También tiene una aplicación de prueba de dibujo, resultados e información de conclusiones para diferentes sistemas operativos a los que desea apuntar.
fuente
Los paneles que menciona son paneles de diseño, por lo que una breve descripción del sistema de diseño sugiere que probablemente no se trate solo de una lista simple del panel más eficiente, sino de cómo usar los paneles que tienen el mayor efecto en la eficiencia y el rendimiento.
LayoutSystem_Overview :
En su forma más simple, el diseño es un sistema recursivo que lleva a un elemento a ser dimensionado, posicionado y dibujado. Más específicamente, el diseño describe el proceso de medir y organizar los miembros de la colección Children de un elemento Panel. El diseño es un proceso intensivo. Cuanto más grande sea la colección Children, mayor será el número de cálculos que deben hacerse. La complejidad también se puede introducir en función del comportamiento de diseño definido por el elemento Panel que posee la colección. Un Panel relativamente simple, como Canvas, puede tener un rendimiento significativamente mejor que un Panel más complejo, como Grid.
Cada vez que un elemento UIElement secundario cambia su posición, tiene el potencial de activar un nuevo pase por el sistema de diseño. Por lo tanto, es importante comprender los eventos que pueden invocar el sistema de diseño, ya que la invocación innecesaria puede conducir a un bajo rendimiento de la aplicación. A continuación se describe el proceso que ocurre cuando se invoca el sistema de diseño.
1. Un elemento UIE secundario comienza el proceso de diseño midiendo primero sus propiedades centrales.
2. Se evalúan las propiedades de tamaño definidas en FrameworkElement, como Ancho, Altura y Margen.
3. Se aplica la lógica específica del panel, como la dirección de acoplamiento o la orientación de apilamiento.
4. El contenido se organiza después de que todos los niños hayan sido medidos.
5. La colección Niños se dibuja en la pantalla.
6. El proceso se invoca nuevamente si se agregan elementos secundarios adicionales a la colección, se aplica un LayoutTransform o se llama al método UpdateLayout.
Vea LayoutSystem_Measure_Arrange para obtener más información sobre la medición y la organización de los niños.
LayoutSystem_Performance :
El diseño es un proceso recursivo. Cada elemento secundario de una colección Secundaria se procesa durante cada invocación del sistema de diseño. Como resultado, se debe evitar activar el sistema de diseño cuando no es necesario. Las siguientes consideraciones pueden ayudarlo a lograr un mejor rendimiento.
Tenga en cuenta qué cambios en el valor de la propiedad forzarán una actualización recursiva por parte del sistema de diseño.
Las propiedades de dependencia cuyos valores pueden hacer que el sistema de diseño se inicialice están marcadas con banderas públicas. AffectsMeasure y AffectsArrange proporcionan pistas útiles sobre qué cambios en el valor de la propiedad forzarán una actualización recursiva por parte del sistema de diseño. En general, cualquier propiedad que pueda afectar el tamaño del cuadro delimitador de un elemento debe tener un indicador AffectsMeasure establecido en verdadero. Para obtener más información, consulte Descripción general de las propiedades de dependencia.
Cuando sea posible, use un RenderTransform en lugar de un LayoutTransform.
LayoutTransform puede ser una forma muy útil de afectar el contenido de una interfaz de usuario (UI). Sin embargo, si el efecto de la transformación no tiene que afectar la posición de otros elementos, es mejor usar RenderTransform, porque RenderTransform no invoca el sistema de diseño. LayoutTransform aplica su transformación y fuerza una actualización de diseño recursiva para tener en cuenta la nueva posición del elemento afectado.
Evite llamadas innecesarias a UpdateLayout.
El método UpdateLayout fuerza una actualización de diseño recursiva, y con frecuencia no es necesario. A menos que esté seguro de que se requiere una actualización completa, confíe en el sistema de diseño para llamar a este método por usted.
Cuando trabaje con una gran colección Children, considere usar un VirtualizingStackPanel en lugar de un StackPanel normal.
Al virtualizar la colección secundaria, VirtualizingStackPanel solo mantiene los objetos en la memoria que están actualmente dentro del ViewPort principal. Como resultado, el rendimiento mejora sustancialmente en la mayoría de los escenarios.
Optimización del rendimiento: diseño y diseño : este artículo detalla cómo construir el árbol de manera eficiente y ofrece una lista simple de paneles según su complejidad
Lienzo (menos complext = más eficiente y mejor rendimiento)
Cuadrícula
Otros paneles (más complejos = menos eficiente y peor rendimiento)
Otras consideraciones de rendimiento a las que debe prestar atención: Formas de mejorar la velocidad de representación de la interfaz de usuario de WPF
fuente