Maximize o desempenho do WPF 3D
Como 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 seu aplicativo, juntamente com recomendações para otimizar o desempenho quando você usá-los.
Este tópico pressupõe uma compreensão avançada dos recursos 3D do Windows Presentation Foundation (WPF). As sugestões neste documento aplicam-se à "camada de renderização 2" — definida aproximadamente como hardware que suporta sombreador de pixel versão 2.0 e sombreador de vértice versão 2.0. Para obter mais detalhes, consulte Níveis de Renderização Gráfica.
Impacto no desempenho: alto
Propriedade | Recomendação |
---|---|
Brush | Velocidade da escova (mais rápida a mais lenta): SolidColorBrush LinearGradientBrush ImageBrush DrawingBrush (armazenado em cache) VisualBrush (armazenado em cache) RadialGradientBrush DrawingBrush (não armazenado em cache) VisualBrush (não armazenado em cache) |
ClipToBoundsProperty | Defina Viewport3D.ClipToBounds como false sempre que não precisar que o Windows Presentation Foundation (WPF) recorte explicitamente o conteúdo de um Viewport3D dentro do retângulo do Viewport3D. O recorte antialiased 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 não precisar que o Windows Presentation Foundation (WPF) considere o conteúdo de um Viewport3D ao realizar o teste de deteção de clique do rato. O teste de acerto de conteúdo 3D é feito em software e pode ser lento com grandes malhas.
IsHitTestVisible está ativado (lento) por padrão no Viewport3D. |
GeometryModel3D | Crie modelos diferentes somente quando eles exigirem Materiais ou Transformações diferentes. Caso contrário, tente aglutinar muitas instâncias GeometryModel3D com os mesmos Materiais e Transformações em algumas instâncias maiores GeometryModel3D e MeshGeometry3D. |
MeshGeometry3D | A animação de malha — alterar os vértices individuais de uma malha por quadro — nem sempre é eficiente no Windows Presentation Foundation (WPF). Para minimizar o impacto no desempenho das 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. Uma vez modificada a malha, volte a anexá-la à árvore visual. Além disso, tente minimizar o tamanho das malhas que serão animadas desta forma. |
Antialiasing 3D | Para aumentar a velocidade de renderização, desative a amostragem múltipla em Viewport3D definindo a propriedade associada EdgeMode como Aliased . Por predefinição, o antialiasing 3D está ativado no Windows com 4 amostras por pixel. |
Texto | O texto ao vivo numa cena 3D (ao vivo porque está num DrawingBrush ou VisualBrush) poderá 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 VisualBrush ou um DrawingBrush em uma cena 3D porque o conteúdo do pincel não é estático, tente armazenar o pincel em cache (definindo 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 armazenados em cache não sejam regenerados com muita frequência, mantendo o nível de qualidade desejado. Por padrão, DrawingBrush 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, todo o conteúdo do pincel deve primeiro ser reprocessado 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 o melhor desempenho, não utilize BitmapEffect. |
Impacto no desempenho: Médio
Propriedade | Recomendação |
---|---|
MeshGeometry3D | Quando uma malha é definida como triângulos adjacentes com vértices compartilhados e esses vértices têm a mesma posição, coordenadas normais e de 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 RenderTargetBitmap e/ou um ImageBrush). Note que texturas de resolução mais baixa podem diminuir a qualidade visual, por isso tente encontrar o equilíbrio certo 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 estás a usar numa cena. Coloque muitos modelos 3D no mesmo Viewport3D em vez de criar instâncias Viewport3D separadas para cada modelo. |
Freezable | Normalmente, é benéfico reutilizar MeshGeometry3D, GeometryModel3D, escovas e materiais. Todos são multiparentáveis, uma vez que são derivados de Freezable . |
Freezable | Chame o método Freeze em Freezables quando suas propriedades permanecerem 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 mudar. O conteúdo 2D pode ser convertido em um Image via RenderTargetBitmap e, em seguida, usado em um ImageBrush. |
BackMaterial | Não uses BackMaterial a menos que realmente precises de ver as superfícies traseiras do teu GeometryModel3D. |
Light | Velocidade da luz (mais rápida a mais lenta): AmbientLight DirectionalLight PointLight SpotLight |
MeshGeometry3D | Lembre-se de manter os tamanhos da malha dentro destes limites: Positions: 20.001 Point3D instâncias TriangleIndices: 60,003 Int32 instâncias |
Material | Velocidade do material (do mais rápido para o mais lento): EmissiveMaterial DiffuseMaterial SpecularMaterial |
Brush | O Windows Presentation Foundation (WPF) 3D não exclui pincéis invisíveis (pincéis ambientes pretos, pincéis transparentes, etc.) de forma consistente. Considere omitir estes da sua cena. |
MaterialGroup | Cada Material em um MaterialGroup causa outra passagem de renderização, portanto, 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 MaterialGroup. |
Impacto no 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 em sua cena. Muitas luzes em uma cena forçarão o Windows Presentation Foundation (WPF) a voltar para a renderização de software. Os limites são aproximadamente 110 objetos DirectionalLight, 70 objetos PointLight ou 40 objetos SpotLight. |
ModelVisual3D | Separe objetos em movimento de objetos estáticos colocando-os em instâncias ModelVisual3D separadas. ModelVisual3D é "mais pesado" do que GeometryModel3D porque armazena em cache limites transformados. GeometryModel3D é otimizado para ser um modelo; ModelVisual3D é otimizado para ser um nó de 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 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 seu sombreador armazenado em cache). |
Luz | As luzes pretas não serão visíveis, mas aumentarão o tempo de renderização; considere omiti-los. |
MeshGeometry3D | Para minimizar o tempo de construção de grandes coleções no Windows Presentation Foundation (WPF), como um MeshGeometry3D Positions, Normals, TextureCoordinatese TriangleIndices, pré-dimensione as coleções antes da população de valor. Sempre que possível, passe aos construtores das coleções estruturas de dados preenchidas previamente, como arrays ou listas. |
Ver também
.NET Desktop feedback