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 |
Velocidade de Brush (mais rápido para mais lento): DrawingBrush (em cache) VisualBrush (em cache) DrawingBrush (sem cache) VisualBrush (sem cache) |
|
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. |
|
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. |
|
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. |
|
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. |
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 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 |
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. |
|
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. |
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. |
|
Geralmente é útil reutilizar MeshGeometry3D, GeometryModel3D, pincéis e materiais. Todos podem ter vários pais já que são derivados de 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. |
|
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. |
|
Não use BackMaterial a menos que você realmente precise ver as faces de trás do seu GeometryModel3D. |
|
Velocidade da luz (mais rápida para mais lenta): |
|
Tente manter os tamanhos das malhas abaixo desses limites: Positions: 20.001 Point3D instâncias TriangleIndices: 60.003 Int32 instâncias |
|
Velocidade de materiais (mais rápida para mais lenta): |
|
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. |
|
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 |
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. |
|
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. |
|
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. |
|
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. |
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