Share via


Maximizar el rendimiento de representación 3D en WPF

Cuando se utiliza 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 clases y propiedades 3D que afectan al rendimiento de la aplicación, junto con las recomendaciones para optimizar el rendimiento al utilizarlas.

En este tema se da por hecho que el lector tiene una comprensión avanzada de las características 3D de Windows Presentation Foundation (WPF). Las sugerencias de este documento se aplican al "nivel de presentación 2", que se define a grandes rasgos como el 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, vea 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 caché)

VisualBrush (almacenado en memoria caché)

RadialGradientBrush

DrawingBrush (no almacenado en memoria caché)

VisualBrush (no almacenado en memoria caché)

ClipToBoundsProperty

Establezca Viewport3D.ClipToBounds en false siempre que no necesite que Windows Presentation Foundation (WPF) recorte explícitamente el contenido de Viewport3D al rectángulo de Viewport3D. El recorte con suavizado de contorno de Windows Presentation Foundation (WPF) puede ser muy lento y ClipToBounds está habilitado (lento) de manera predeterminada en Viewport3D.

IsHitTestVisible

Establezca Viewport3D.IsHitTestVisible en false siempre que no haga falta que Windows Presentation Foundation (WPF) tenga en cuenta el contenido de Viewport3D al realizar las pruebas de posicionamiento del mouse. Las pruebas de posicionamiento del contenido 3D se efectúan en el software y pueden resultar lentas con mallas grandes. IsHitTestVisible está habilitado (lento) de manera predeterminada en Viewport3D.

GeometryModel3D

Cree modelos diferentes únicamente cuando requieran materiales o transformaciones diferentes. De lo contrario, intente combinar varias instancias GeometryModel3D que tengan el mismo material y las mismas transformaciones en unas pocas instancias de GeometryModel3D y MeshGeometry3D mayores.

MeshGeometry3D

Animación de mallas: cambiar los vértices individuales de una malla fotograma a fotograma no siempre es eficaz en Windows Presentation Foundation (WPF). Para minimizar el impacto en el rendimiento de las notificaciones de cambios cuando se modifica cada vértice, desasocie la malla del árbol visual antes de realizar la modificación por vértices. Una vez modificada la malla, vuelva a adjuntarla al árbol visual. Además, intente minimizar el tamaño de las mallas que se animarán de esta manera.

Suavizado de contorno 3D

Para aumentar la velocidad de representación, deshabilite el muestreo múltiple en Viewport3D estableciendo la propiedad EdgeMode adjunta en Aliased. De manera predeterminada, el suavizado de contorno 3D está deshabilitado en Microsoft Windows XP y habilitado en Windows Vista con 4 muestras por píxel.

Text

El texto activo en una escena 3D (activo porque está en un DrawingBrush o VisualBrush) puede ser lento. Intente utilizar imágenes del texto en su lugar (mediante RenderTargetBitmap), a menos que se trate de texto que vaya a cambiar.

TileBrush

Si debe utilizar VisualBrush o DrawingBrush en una escena 3D porque el contenido del pincel no es estático, intente almacenar el pincel en la memoria caché (estableciendo la propiedad CachingHint adjunta en Cache). Establezca umbrales de invalidación de escala mínimos (con las propiedades adjuntas CacheInvalidationThresholdMinimum y CacheInvalidationThresholdMaximum) y máximos para que no se regeneren los pinceles almacenados en memoria caché con demasiada frecuencia, pero se mantenga el nivel de calidad deseado. De manera predeterminada, DrawingBrush y VisualBrush no se almacenan en memoria caché, lo que significa que cada vez que hay que representar de nuevo algún elemento pintado con el pincel, el contenido completo del pincel se tiene que representar de nuevo antes en una superficie intermedia.

BitmapEffect

BitmapEffect obliga a representar todo el contenido afectado sin aceleración de hardware. Para obtener el máximo rendimiento, no utilice 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 una sola vez y, a continuación, defina los triángulos por índices mediante TriangleIndices.

ImageBrush

Intente minimizar el tamaño de las texturas cuando tenga el control explícito del tamaño (cuando utilice RenderTargetBitmap o ImageBrush). Tenga en cuenta que las texturas de resolución más baja pueden disminuir la calidad visual, así que intente hallar el equilibrio apropiado entre calidad y rendimiento.

Opacidad

Al representar contenido 3D translúcido (como las reflexiones), utilice las propiedades de opacidad en pinceles o materiales (mediante Opacity o Color) en lugar de crear un Viewport3D translúcido independiente estableciendo Viewport3D.Opacity en un valor menor que 1.

Viewport3D

Minimice el número de objetos Viewport3D que utiliza en una escena. Coloque varios modelos 3D en la misma Viewport3D, en lugar de crear instancias de Viewport3D independientes para cada modelo.

Freezable

Normalmente, es beneficioso reutilizar los MeshGeometry3D, los GeometryModel3D, los pinceles y los materiales. Todos pueden tener varios elementos primarios, puesto que se derivan de Freezable.

Freezable

Llame al método Freeze en Freezables cuando sus propiedades vayan a permanecer sin cambios en la aplicación. La inmovilización puede disminuir espacio de trabajo y aumentar la velocidad.

Brush

Utilice ImageBrush en lugar de VisualBrush o DrawingBrush cuando el contenido del pincel no vaya a cambiar. El contenido 2D se puede convertir en una Image mediante RenderTargetBitmap y, a continuación, se puede utilizar en un ImageBrush.

BackMaterial

No utilice BackMaterial a menos que realmente necesite ver las caras posteriores del GeometryModel3D.

Light

Velocidad de la luz (de mayor a menor):

AmbientLight

DirectionalLight

PointLight

SpotLight

MeshGeometry3D

Intente mantener los tamaños de las malla por debajo de estos límites:

Positions: 20.001 instancias de Point3D

TriangleIndices: 60.003 instancias de Int32

Material

Velocidad de los materiales (de mayor a menor):

EmissiveMaterial

DiffuseMaterial

SpecularMaterial

Brush

Windows Presentation Foundation (WPF) 3D no cancela los pinceles no visibles (pinceles de ambiente negros, pinceles claros, etc.) de una manera coherente. Puede ser conveniente omitirlos de la escena.

MaterialGroup

Cada Material de un MaterialGroup provoca un paso más de representación; por este motivo, incluir muchos materiales, aunque sean simples, puede aumentar drásticamente las solicitudes de relleno sobre la GPU. Minimice el número de materiales del MaterialGroup.

Impacto en el rendimiento: bajo

Propiedad

Recomendación

Transform3DGroup

Cuando no necesite la animación o el enlace de datos, en lugar de utilizar un grupo de transformaciones que contiene varias transformaciones, utilice una sola MatrixTransform3D, y establézcala de modo que sea el producto de todas las transformaciones que, en otro caso, existirían independientemente en el grupo de transformaciones.

Light

Minimice el número de luces de la escena. Demasiadas luces en una escena obligarán a Windows Presentation Foundation (WPF) a recurrir 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 estáticos colocándolos en instancias de ModelVisual3D independientes. ModelVisual3D es más "pesado" que GeometryModel3D, porque almacena en memoria caché los límites transformados. GeometryModel3D está optimizado para ser un modelo; ModelVisual3D lo está para ser nodo de escena. Utilice ModelVisual3D para colocar instancias compartidas de GeometryModel3D en la escena.

Light

Minimice el número de veces que cambia al número de luces de la escena. Cada cambio del número de luces fuerza una regeneración del sombreador y una recompilación, a menos que esa configuración haya existido previamente (y, por tanto, su sombreador esté almacenado en memoria caché).

Luz

Las luces negras no son visibles, pero agregan tiempo de representación; puede ser conveniente omitirlas.

MeshGeometry3D

Para minimizar el tiempo de construcción de las colecciones grandes en Windows Presentation Foundation (WPF), tales como Positionsde MeshGeometry3D, Normals, TextureCoordinates y TriangleIndices, ajuste previamente el tamaño de las colecciones antes de rellenar los valores. Si es posible, pase estructuras de datos previamente rellenadas, como matrices o listas, a los constructores de las colecciones.

Vea también

Conceptos

Información general sobre gráficos 3D