Compartilhar via


Maximizar o desempenho do WPF 3D

sistema autônomo você usa o Windows Presentation Foundation (WPF) Para criar controles 3D e incluir cenas 3D em seus aplicativos, é importante considerar a otimização do desempenho. Este tópico fornece uma lista de classes 3D e propriedades que têm implicações de desempenho para seu aplicativo, juntamente com recomendações para otimizar o desempenho quando você sistema autônomo usa.

Este tópico pressupõe uma compreensão avançada dos recursos 3D do Windows Presentation Foundation (WPF). As sugestões contidas neste documento se aplicam a "camada de renderização 2" — aproximadamente definida como hardware que oferece suporte a pixel shader versão 2.0 e vertex shader versão 2.0. Para mais detalhes, consulte Níveis de Renderização Gráfica.

Impacto de desempenho: Alto

Propriedade

Recomendação

Brush

Velocidade de Brush (mais rápido para mais lento):

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) explicitamente corte o conteúdo de um Viewport3D no retângulo do Viewport3D. O recorte com antialiasing do Windows Presentation Foundation (WPF) pode sermuito lento, e ClipToBounds é ativado (lento) por padrão no Viewport3D.

IsHitTestVisible

conjunto Viewport3D.IsHitTestVisible para false quando não precisar Windows Presentation Foundation (WPF) considerar o conteúdo de um Viewport3D Quando o mouse desempenho atingido testes.  Visita conteúdo 3D teste é concluído no software e pode ser lento com grandes malhas. IsHitTestVisible é ativado (lento) por padrão em Viewport3D.

GeometryModel3D

Crie modelos diferentes somente quando eles exigem materiais ou transformações diferentes. Caso contrário, tente agregar muitas instâncias de GeometryModel3D com os mesmos materiais e transformações em algumas instâncias maiores de GeometryModel3D e MeshGeometry3D.

MeshGeometry3D

Animação da malha — alterando os vértices individuais de uma malha em uma base por quadro — nem sempre é eficiente em Windows Presentation Foundation (WPF).  Para minimizar o impacto sobre o desempenho de notificações de alterar quando cada vértice é modificado, desanexe da malha da árvore visual antes de executar modificação por vértice.  Depois que tiver sido modificada na malha, anexe-o para a árvore visual.  Além disso, tente minimizar o dimensionar de malhas que será animada dessa maneira.

Antialiasing 3D

Para aumentar a velocidade de renderização, desative multisampling no Viewport3D definindo a propriedade anexada EdgeMode como Aliased. Por padrão, antialiasing 3D é desativado no Microsoft Windows XP e ativado no Windows Vista com 4 exemplos por pixel.

Texto

Texto "vivo" em uma cena 3D ("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 vá ser alterado.

TileBrush

Se você deve usar um VisualBrush ou um DrawingBrush em uma cena 3D pois o conteúdo do pincel não é estático, tente fazer cache do pincel (configurando a propriedade anexada CachingHint como Cache). Defina os limites mínimo e máximo de invalidação de escala (com as propriedades anexadas CacheInvalidationThresholdMinimum e CacheInvalidationThresholdMaximum) para que os pincéis na cache não sejam regenerados com muita frequência, mas ainda mantendo nível de qualidade desejado. Por padrão, DrawingBrush e VisualBrush não são armazenados na cache, o que significa que sempre que algo pintado com o pincel tem que ser re-renderizado, todo o conteúdo do pincel deve primeiro ser re-renderizado para uma superfície intermediária.

BitmapEffect

BitmapEffect força todo o conteúdo afetado a ser renderizado sem aceleração de hardware. Para obter um melhor desempenho, não use BitmapEffect.

Impacto de desempenho: Médio

Propriedade

Recomendação

MeshGeometry3D

Quando uma malha é definida como triângulos adjacentes que compartilham vértices e os vértices têm a mesma posição, normal, e coordenadas de textura, defina cada vértice compartilhado somente uma vez e defina seus triângulos por índice com TriangleIndices.

ImageBrush

Tente minimizar os tamanhos das texturas quando você tiver controle explícito sobre o tamanho (quando você estiver usando um RenderTargetBitmap e/ou um ImageBrush). Observe que texturas de resolução inferior podem diminuir a qualidade visual, então tente determinar o equilíbrio correto entre qualidade e desempenho.

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 Viewport3D translúcido separado definindo Viewport3D.Opacity com um valor menor que 1.

Viewport3D

Minimize o número de objetos Viewport3D que você está usando em uma cena. Coloque vários modelos 3D no mesmo Viewport3D em vez de criar instâncias separadas de Viewport3D para cada modelo.

Freezable

Geralmente é útil reutilizar MeshGeometry3D, GeometryModel3D, pincéis e materiais. Todos podem ter vários pais já que são derivados de Freezable.

Freezable

Chame o método Freeze em Freezables quando suas propriedades permanecerão inalteradas no seu aplicativo. "Freezing" 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 vai ser alterarado. Conteúdo 2D pode ser convertido em uma Image via RenderTargetBitmap e usado em um ImageBrush.

BackMaterial

Não use BackMaterial a menos que você realmente precise ver as faces de trás 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 de materiais (mais rápida para mais lenta):

EmissiveMaterial

DiffuseMaterial

SpecularMaterial

Brush

Windows Presentation Foundation (WPF) 3D não sair pincéis invisível (preto ambiente pincéis, desmarcar pincéis, etc.) de maneira consistente.  Considere omitindo esses em sua cena.

MaterialGroup

Cada Material em um MaterialGroup causa outro passo de renderização, então incluir vários materiais, até mesmo materiais simples, pode aumentar drasticamente as demandas de preenchimento na sua GPU. Minimize o número de materiais em seu MaterialGroup.

Impacto de desempenho: Baixo

Propriedade

Recomendação

Transform3DGroup

Quando você não precisar de animação ou de associação de dados, ao invés de usar um grupo de transformações que contém várias transformações, use uma única MatrixTransform3D, definindo-a para ser o produto de todas as transformações que, caso contrário, existiriam independentemente no grupo de transformações.

Light

Minimize o número de luzes na sua cena. Muitas luzes em uma cena forçará Windows Presentation Foundation (WPF) Para voltar a renderização do software.  Os limites são aproximadamente 110 DirectionalLight objetos, 70 PointLight objetos ou 40 SpotLight objetos.

ModelVisual3D

Separe objetos que se movem de objetos estáticos colocando-os em instâncias separadas de ModelVisual3D. ModelVisual3D é "mais pesado" que GeometryModel3D pois ele armazena em cache os limites transformados. GeometryModel3D é otimizado para ser um modelo; 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 na quantidade de luzes luz força uma regeração e recompilação do shader a menos que essa configuração tenha existido anteriormente (e, portanto, teve seu shader colocado na cache).

Luz

Luzes pretas não serão visíveis, mas irão aumentar o tempo de renderização; considere omití-las.

MeshGeometry3D

Para minimizar o tempo de construção de grandes coleções no Windows Presentation Foundation (WPF), como Positions, Normals, TextureCoordinates e TriangleIndices de uma MeshGeometry3D, pré-defina o tamanho das coleções antes de popular seus valores. Se possível, passe estruturas de dados já preenchidas para os construtores das coleções, como vetores (arrays) ou Lists.

Consulte também

Conceitos

Visão geral de elementos gráficos 3D

Outros recursos

Exemplos de elementos gráficos 3D