¿Por qué el uso de plumas con patrones de guiones causan enormes (!) La degradación del rendimiento en la costumbre de WPF dibujo 2D?

StackOverflow https://stackoverflow.com/questions/537950

  •  22-08-2019
  •  | 
  •  

Pregunta

La esperanza alguien puede arrojar luz sobre esto, así que puedo utilizar bolígrafos con patrones de guiones?

Estoy escribiendo una carta de desplazamiento (un Panel dentro ScrollViewer que implementa IScrollInfo) en WPF usando DrawingVisual de DataContext.Draw X . Tengo varios miles de DrawingVisuals que consiguen desplazar por el uso de TranslateTransform en el Panel que los acoge. He implementado una rejilla mediante la colocación de un Panel en la parte superior de la misma y el trazado de líneas horizontales simples desde un borde al otro usando DataContext.DrawLine(pen, new Point(0, y), new Point(widthOfPanel, y)); // (nota: estas líneas son siempre estática, que nunca se mueven).

El rendimiento de desplazamiento es absolutamente loco (es decir DrawingVisual se dibujan de forma instantánea y el desplazamiento es instantánea). Pero si uso un Pen que utiliza patrones de guiones (véase más adelante, por ejemplo) para dibujar las líneas de la cuadrícula, a continuación, desplaza es muy desigual y el rendimiento parece haber sido disminuido por un factor de 100 (una estimación). ¿Puede alguien explicar por qué sucede esto y cómo puedo solucionar esto?

Ejemplo de Pen con el patrón de tablero:

<Pen x:Key="PenUsingDashPatterns" Brush="Black" Thickness="1">
   <Pen.DashStyle >
      <DashStyle Dashes="3, 3" />
   </Pen.DashStyle>
</Pen>
¿Fue útil?

Solución

son cada vez congeladas las plumas? Congelar objetos de dibujo ayuda mucho el rendimiento.

Se puede configurar un controlador cargado y depuración para ver si se congelan sus plumas. Si no, llame al botón Pen.Freeze () manualmente sobre ellos.

Tenga en cuenta que la congelación también hace que las plumas de sólo lectura ... usted no será capaz de modificarlos después de que se congelen.

Otros consejos

Aquí hay una posible solución - si sólo el trazado de líneas horizontales y / o verticales que podría intentar crear su Pen con un dibujo de damero DrawingBrush tales como:

  <Pen x:Key="PenUsingDashPatterns" Thickness="1">
        <Pen.Brush>
            <DrawingBrush TileMode="Tile" 
                          Viewport="0 0 6 6" ViewportUnits="Absolute">
                <DrawingBrush.Drawing>
                    <GeometryDrawing Brush="Black">
                        <GeometryDrawing.Geometry>
                            <GeometryGroup>
                                <RectangleGeometry  Rect="0 0 3 3"/>
                                <RectangleGeometry  Rect="3 3 3 3"/>
                            </GeometryGroup>
                        </GeometryDrawing.Geometry>
                    </GeometryDrawing>
                </DrawingBrush.Drawing>
            </DrawingBrush>
        </Pen.Brush>
    </Pen>   

Como alternativa, puede utilizar diferentes pinceles para verical y las líneas horizontales, o, posiblemente, una ImageBrush para un mejor rendimiento.

Debe usar el perforador de profundizar en el problema de rendimiento. Aquí hay un enlace al sitio de MSDN hablando de varios WPF herramientas de rendimiento . Perforador probablemente sería la herramienta que le ayudará a la mayoría, especialmente en la determinación de si las líneas se están elaborando utilizando el software de render (que sería el mayor factor en la que le da tan mal rendimiento).

Si el problema es que se están elaborando en el software, es posible que tenga que escribir su propio ShaderEffect , pero que probablemente va a ser complicado rápida a menos que esté familiarizado con HLSL.

Lo más probable es que sea debido a esta operación de dibujo en particular no es algo que se puede delegar a la tarjeta de video, lo que obligaría a la composición en la memoria y blitting a la tarjeta de vídeo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top