Maximizar el rendimiento de representación 3D en WPF
Al usar Windows Presentation Foundation (WPF) para compilar controles 3D e incluir escenas 3D en las aplicaciones, es importante tener en cuenta la optimización del rendimiento. En este tema se proporciona una lista de las clases y propiedades 3D que tienen implicaciones en el rendimiento de la aplicación, junto con recomendaciones para optimizar el rendimiento cuando se usan.
En este tema se supone un conocimiento avanzado de las características 3D de Windows Presentation Foundation (WPF). Las sugerencias de este documento se aplican al «nivel de representación 2», que se define aproximadamente como hardware que admite la versión 2.0 del sombreador de píxeles y la versión 2.0 del sombreador de vértices. Para obtener información más detallada, consulte Niveles de representación de gráficos.
Impacto en el rendimiento: alto
Propiedad | Recomendación |
---|---|
Brush | Velocidad del pincel (de más rápida a más lenta): SolidColorBrush LinearGradientBrush ImageBrush DrawingBrush (almacenado en memoria caché) VisualBrush (almacenado en memoria caché) RadialGradientBrush DrawingBrush (sin almacenar en caché) VisualBrush (sin almacenar en caché) |
ClipToBoundsProperty | Establezca Viewport3D.ClipToBounds en falso siempre que no necesite que Windows Presentation Foundation (WPF) recorte explícitamente el contenido de un Viewport3D al rectángulo de Viewport3D. Los recortes con antialias con Windows Presentation Foundation (WPF) pueden ser muy lentos y ClipToBounds está habilitado (lento) de forma predeterminada en Viewport3D. |
IsHitTestVisible | Establezca Viewport3D.IsHitTestVisible en falso siempre que no necesite que Windows Presentation Foundation (WPF) tenga en cuenta el contenido de un Viewport3D al realizar pruebas de posicionamiento del mouse. Las pruebas de posicionamiento del contenido 3D se realizan en software y pueden ser lentas con mallas grandes. IsHitTestVisible está habilitado (lento) de forma predeterminada en Viewport3D. |
GeometryModel3D | Cree modelos diferentes solo cuando necesiten diferentes materiales o transformaciones. De lo contrario, intente fusionar varias instancias de GeometryModel3D con los mismos materiales y transformaciones en unas cuantas instancias de GeometryModel3D y MeshGeometry3D más grandes. |
MeshGeometry3D | Animación de mallas (cambiar los vértices individuales de una malla por fotograma) no siempre es eficaz en Windows Presentation Foundation (WPF). Para minimizar el impacto en el rendimiento de las notificaciones de cambio cuando se modifica cada vértice, desasocie la malla del árbol visual antes de realizar la modificación por vértice. Una vez modificada la malla, vuelva a adjuntarla al árbol visual. Además, intente minimizar el tamaño de las mallas que va a animar de esta manera. |
Suavizado de contorno 3D | Para aumentar la velocidad de representación, deshabilite el muestreo múltiple en un Viewport3D estableciendo la propiedad adjunta EdgeMode en Aliased . De forma predeterminada, el suavizado de contorno 3D está habilitado en Windows con 4 muestras por píxel. |
Texto | El texto en directo en una escena 3D (en directo porque está en un DrawingBrush o VisualBrush) puede ser lento. Intente usar imágenes del texto en su lugar (a través de RenderTargetBitmap), a menos que el texto vaya a cambiar. |
TileBrush | Si debe usar un VisualBrush o un DrawingBrush en una escena 3D porque el contenido del pincel no es estático, intente almacenar el pincel en caché (estableciendo la propiedad adjunta CachingHint en Cache ). Establezca los umbrales de invalidación de escala mínimo y máximo (con las propiedades adjuntas CacheInvalidationThresholdMinimum y CacheInvalidationThresholdMaximum) para que los pinceles almacenados en caché no se vuelvan a generar con demasiada frecuencia, a la vez que mantiene el nivel de calidad deseado. De forma predeterminada, DrawingBrush y VisualBrush no se almacenan en caché, lo que significa que cada vez que algo pintado con el pincel debe volver a representarse, todo el contenido del pincel debe volver a representarse en una superficie intermedia. |
BitmapEffect | BitmapEffect obliga a que todo el contenido afectado se represente sin aceleración de hardware. Para obtener el mejor rendimiento, no use BitmapEffect. |
Impacto en el rendimiento: medio
Propiedad | Recomendación |
---|---|
MeshGeometry3D | Cuando una malla se define como triángulos colindantes con vértices compartidos y esos vértices tienen las mismas posición, normal y coordenadas de textura, defina cada vértice compartido solo una vez y, a continuación, defina los triángulos mediante índice con TriangleIndices. |
ImageBrush | Intente minimizar los tamaños de textura cuando tenga control explícito sobre el tamaño (cuando use un RenderTargetBitmap y/o un ImageBrush). Tenga en cuenta que las texturas de resolución inferior pueden disminuir la calidad visual, por lo que hay intentar encontrar el equilibrio adecuado entre la calidad y el rendimiento. |
Opacidad | Al representar contenido 3D translúcido (como reflexiones), use las propiedades de opacidad en pinceles o materiales (a través de Opacity o Color) en lugar de crear un Viewport3D translúcido independiente estableciendo Viewport3D.Opacity en un valor inferior a 1. |
Viewport3D | Minimice el número de objetos Viewport3D que está usando en una escena. Coloque muchos modelos 3D en el mismo Viewport3D en lugar de crear instancias de Viewport3D independientes para cada modelo. |
Freezable | Normalmente es beneficioso reutilizar MeshGeometry3D, GeometryModel3D, pinceles y materiales. Todos son multiparentables, ya que se derivan de Freezable . |
Freezable | Llame al método Freeze en Freezables cuando sus propiedades permanezcan sin cambios en la aplicación. La inmovilización puede disminuir el espacio de trabajo y aumentar la velocidad. |
Brush | Use ImageBrush en lugar de VisualBrush o DrawingBrush cuando el contenido del pincel no vaya a cambiar. El contenido 2D se puede convertir en un Image vía RenderTargetBitmap y, a continuación, usarse en ImageBrush. |
BackMaterial | No use BackMaterial a menos que realmente necesite ver las caras posteriores de su GeometryModel3D. |
Light | Velocidad de luz (de más rápida a más lenta): AmbientLight DirectionalLight PointLight SpotLight |
MeshGeometry3D | Intente mantener los tamaños de malla bajo estos límites: Positions: 20,001 instancias de Point3D TriangleIndices: 60,003 instancias de Int32 |
Material | Velocidad de material (de más rápida a más lenta): EmissiveMaterial DiffuseMaterial SpecularMaterial |
Brush | Windows Presentation Foundation (WPF) 3D no desactiva los pinceles invisibles (pinceles ambientales negros, pinceles claros, etc.) de forma coherente. Considere la posibilidad de omitirlos de la escena. |
MaterialGroup | Cada Material en un MaterialGroup provoca otro pase de representación, por lo que si incluye muchos materiales, incluso materiales simples, puede aumentar drásticamente las demandas de relleno en la GPU. Minimice el número de materiales de su MaterialGroup. |
Impacto del rendimiento: bajo
Propiedad | Recomendación |
---|---|
Transform3DGroup | Cuando no necesite animación o enlace de datos, en lugar de usar un grupo de transformación que contenga varias transformaciones, use un único MatrixTransform3D, estableciéndolo como el producto de todas las transformaciones que, de lo contrario, existirían independientemente en el grupo de transformación. |
Light | Minimice el número de luces de la escena. Demasiadas luces en una escena forzarán a Windows Presentation Foundation (WPF) a revertir a la representación de software. Los límites son aproximadamente 110 objetos DirectionalLight, 70 objetos PointLight o 40 objetos SpotLight. |
ModelVisual3D | Separe los objetos móviles de los objetos estáticos colocándolos en instancias independientes ModelVisual3D. ModelVisual3D es «más pesado» que GeometryModel3D porque almacena en caché los límites transformados. GeometryModel3D está optimizado para ser un modelo; ModelVisual3D está optimizado para ser un nodo de escena. Use ModelVisual3D para colocar instancias compartidas de GeometryModel3D en la escena. |
Light | Minimice el número de veces que cambia el número de luces de la escena. Cada cambio de recuento de luz fuerza una regeneración y recompilación del sombreador a menos que esa configuración haya existido anteriormente (y, por lo tanto, tuviera su sombreador almacenado en caché). |
Claro | Las luces negras no serán visibles, pero se agregarán al tiempo de representación; considere la posibilidad de omitirlas. |
MeshGeometry3D | Para minimizar el tiempo de construcción de grandes colecciones en Windows Presentation Foundation (WPF), como una colección MeshGeometry3D Positions, Normals, TextureCoordinates y TriangleIndices, debe ajustar previamente el tamaño de las colecciones antes del rellenado de valores. Si es posible, pase a los constructores de las colecciones estructuras de datos rellenadas previamente, como matrices o listas. |
Vea también
.NET Desktop feedback