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