Compartilhar via


Maximizar o desempenho 3D do WPF

À medida que você usa o Windows Presentation Foundation (WPF) para criar controles 3D e incluir cenas 3D em seus aplicativos, é importante considerar a otimização de desempenho. Este tópico fornece uma lista de classes 3D e propriedades que têm implicações de desempenho para o seu aplicativo, juntamente com recomendações para otimizar o desempenho ao usá-las.

Este tópico pressupõe uma compreensão avançada dos recursos 3D do Windows Presentation Foundation (WPF). As sugestões neste documento se aplicam à "camada de renderização 2" – que pode ser definida como um hardware que dá suporte à versão 2.0 do sombreador de pixel e à versão 2.0 do sombreador de vértice. Para mais detalhes, consulte Camadas de renderização de gráficos.

Impacto de desempenho: alto

Propriedade Recomendação
Brush Velocidade do pincel (mais rápida para mais lenta):

SolidColorBrush

LinearGradientBrush

ImageBrush

DrawingBrush (em cache)

VisualBrush (em cache)

RadialGradientBrush

DrawingBrush (sem cache)

VisualBrush (sem cache)
ClipToBoundsProperty Defina Viewport3D.ClipToBounds como false sempre que você não precisar que o Windows Presentation Foundation (WPF) recorte explicitamente o conteúdo de um Viewport3D para o retângulo do Viewport3D. O recorte de serrilhado do Windows Presentation Foundation (WPF) pode ser muito lento e ClipToBounds está habilitado (lento) por padrão no Viewport3D.
IsHitTestVisible Defina Viewport3D.IsHitTestVisible como false sempre que você não precisar do Windows Presentation Foundation (WPF) para considerar o conteúdo de um Viewport3D ao executar o teste de acerto do mouse. O conteúdo em 3D do teste de clique é feito em software e pode ser lento com grandes malhas. IsHitTestVisible está habilitado (lento) por padrão em Viewport3D.
GeometryModel3D Crie modelos diferentes somente quando eles exigirem materiais ou transformações diferentes. Caso contrário, tente aglutinar muitas GeometryModel3D instâncias com os mesmos Materiais e Transforma em algumas instâncias maiores GeometryModel3DMeshGeometry3D .
MeshGeometry3D A animação de malha — alterando os vértices individuais de uma malha por quadro — nem sempre é eficiente no Windows Presentation Foundation (WPF). Para minimizar o impacto no desempenho de notificações de alteração quando cada vértice é modificado, desanexe a malha da árvore visual antes de executar a modificação por vértice. Quando a malha tiver sido modificada, reanexe-a à árvore visual. Além disso, tente minimizar o tamanho das malhas que serão animadas dessa maneira.
Suavização 3D Para aumentar a velocidade de renderização, desabilite a amostragem múltipla em um Viewport3D definindo a propriedade EdgeMode anexada como Aliased. Por padrão, a suavização de borda 3D está habilitada no Windows com 4 amostras por pixel.
Texto O texto ao vivo em uma cena 3D (ao vivo porque está em um DrawingBrush ou VisualBrush) pode ser lento. Tente usar imagens do texto em vez disso (via RenderTargetBitmap), a menos que o texto seja alterado.
TileBrush Se você precisar usar um ou um DrawingBrushVisualBrush em uma cena 3D porque o conteúdo do pincel não é estático, tente armazenar o pincel em cache (definindo a propriedade CachingHint anexada como Cache). Defina os limites mínimo e máximo de invalidação de escala (com as propriedades CacheInvalidationThresholdMinimum anexadas e CacheInvalidationThresholdMaximum) para que os pincéis armazenados em cache não sejam regenerados com muita frequência, mantendo o nível de qualidade desejado. Por padrão, e VisualBrush não são armazenados em cache, o que significa que toda vez que algo pintado com o pincel precisa ser renderizado novamente, DrawingBrush todo o conteúdo do pincel deve primeiro ser renderizado novamente em uma superfície intermediária.
BitmapEffect BitmapEffect força todo o conteúdo afetado a ser renderizado sem aceleração de hardware. Para melhor desempenho, não use BitmapEffect.

Impacto de desempenho: médio

Propriedade Recomendação
MeshGeometry3D Quando uma malha é definida como triângulos de apoio com vértices compartilhados e esses vértices têm as mesmas coordenadas de posição, normal e textura, defina cada vértice compartilhado apenas uma vez e, em seguida, defina seus triângulos por índice com TriangleIndices.
ImageBrush Tente minimizar os tamanhos de textura quando tiver controle explícito sobre o tamanho (quando estiver usando um e/ou um RenderTargetBitmapImageBrush). Observe que texturas de resolução inferior podem diminuir a qualidade visual, então tente determinar o equilíbrio correto entre desempenho e qualidade.
Opacidade Ao renderizar conteúdo 3D translúcido (como reflexos), use as propriedades de opacidade em pincéis ou materiais (via Opacity ou Color) em vez de criar um translúcido Viewport3D separado definindo Viewport3D.Opacity um valor menor que 1.
Viewport3D Minimize o número de Viewport3D objetos que você está usando em uma cena. Coloque vários modelos 3D no mesmo Viewport3D em vez de criar instâncias separadas do Viewport3D para cada modelo.
Freezable Normalmente, é benéfico reutilizar MeshGeometry3D, , GeometryModel3DPincéis e Materiais. Todos podem ter vários pais atribuídos já que são derivados de Freezable.
Freezable Chame o Freeze método em Freezables quando suas propriedades permanecerão inalteradas em seu aplicativo. O congelamento pode diminuir o conjunto de trabalho e aumentar a velocidade.
Brush Use ImageBrush em vez de VisualBrush ou DrawingBrush quando o conteúdo do pincel não for alterado. O conteúdo 2D pode ser convertido em uma Image via RenderTargetBitmap e, em seguida, usado em um ImageBrusharquivo .
BackMaterial Não use BackMaterial a menos que você realmente precise ver as faces traseiras do seu GeometryModel3D.
Light Velocidade da luz (mais rápida para mais lenta):

AmbientLight

DirectionalLight

PointLight

SpotLight
MeshGeometry3D Tente manter os tamanhos das malhas abaixo desses limites:

Positions: 20.001 Point3D instâncias

TriangleIndices: 60.003 Int32 instâncias
Material Velocidade do material (mais rápida para mais lenta):

EmissiveMaterial

DiffuseMaterial

SpecularMaterial
Brush O Windows Presentation Foundation (WPF) 3D não desativa os pincéis invisíveis (pincéis de ambiente pretos, pincéis transparentes, etc.) de forma consistente. Considere omiti-los da sua cena.
MaterialGroup Cada Material um em um MaterialGroup faz com que outro passe de renderização, então incluir muitos materiais, até mesmo materiais simples, pode aumentar drasticamente as demandas de preenchimento em sua GPU. Minimize o número de materiais em seu MaterialGrouparquivo .

Impacto de desempenho: baixo

Propriedade Recomendação
Transform3DGroup Quando você não precisar de animação ou associação de dados, em vez de usar um grupo de transformações contendo várias transformações, use um único MatrixTransform3D, definindo-o como o produto de todas as transformações que, de outra forma, existiriam independentemente no grupo de transformações.
Light Minimize o número de luzes na sua cena. Muitas luzes em uma cena forçarão o Windows Presentation Foundation (WPF) a voltar à renderização de software. Os limites são de aproximadamente 110 objetos, 70 objetos ou 40 DirectionalLightPointLightSpotLight objetos.
ModelVisual3D Separe objetos em movimento de objetos estáticos colocando-os em instâncias separadas ModelVisual3D . ModelVisual3D é "mais pesado" do que GeometryModel3D porque armazena em cache os limites transformados. O GeometryModel3D é otimizado para ser um modelo. O ModelVisual3D é otimizado para ser um nó da cena. Use ModelVisual3D para colocar instâncias compartilhadas de GeometryModel3D na cena.
Light Minimize o número de vezes que você altera o número de luzes na cena. Cada alteração da contagem de luz força uma regeneração e recompilação do sombreador, a menos que essa configuração tenha existido anteriormente (e, portanto, tenha o sombreador armazenado em cache).
Leve As luzes pretas não serão visíveis, mas aumentarão o tempo de renderização. Considere omiti-las.
MeshGeometry3D Para minimizar o tempo de construção de coleções grandes no Windows Presentation Foundation (WPF), como um MeshGeometry3D , , TextureCoordinatese TriangleIndices, Normalspré-dimensione as coleções antes da Positionspopulação de valor. Se possível, passe as estruturas de dados pré-preenchidas dos construtores das coleções como matrizes ou listas.

Confira também