Pergunta

Nosso designer está usando o Blend para estilizar nosso aplicativo WPF. Quando ele escolhe recursos locais para propriedades, a mistura os aplicará como um {DynamicResource} em vez de um {StaticResource}. Meu palpite é que o Blend faz isso porque permite que o aplicativo seja re-temido em tempo de execução sem precisar reiniciá-lo.

Minha pergunta é: existe um custo de desempenho significativo nessa pesquisa adicional? Devemos pedir ao designer que volte e mude manualmente essas dinâmicas para a estática?

Aqui está uma ótima pergunta que explica a diferença entre os tipos: Qual é a diferença entre StaticResource e DynamicResource no WPF?

Foi útil?

Solução

Infelizmente, este é um caso em que é muito difícil fazer uma comparação direta do desempenho relativo, pois o local onde qualquer degradação apareceria é profundo no mecanismo WPF. Nos primeiros dias do WPF, o uso do StaticResource foi uma das alterações padrão de ajuste de desempenho que foi recomendado e tendemos a segui -lo estritamente em nossa organização e recomendá -lo a outras pessoas. Fiquei realmente irritado com o fato de a mistura ter dinâmico tudo, embora isso tenha ajudado a renderizar recursos de outros arquivos corretamente no tempo de design.

Com o tempo, minha opinião sobre isso mudou, devido à experiência pessoal, mas também feedback das pessoas na equipe de mistura da Microsoft. Como você provavelmente está ciente, o Blend é escrito completamente no WPF e possui um tema alternativo completo (luz) que pode ser alternado na mosca enquanto o aplicativo estiver em execução. Isso é possível porque eles usaram o DynamicResource para praticamente todo o seu estilo. Segundo eles, isso realmente não lhes causou problemas de perfis reais. Dado que a mistura é provavelmente a aplicação WPF mais amplamente usada, eu tendem a dar peso significativo às suas opiniões.

A outra coisa a considerar é a utilidade real do DynamicResource. A capacidade de mudar o estilo em tempo real é uma parte dela, mas também a flexibilidade que ela oferece na construção de sua hierarquia de recursos pode facilitar o gerenciamento de estilos compartilhados. Tenho certeza de que você se deparou com uma situação em que uma referência do StaticResource explodiu em tempo de execução, porque o recurso para o qual apontou era ser carregado em um ramo diferente da hierarquia.

Obviamente, o StaticResource é muito útil para apontar para uma chave específica que você sabe que estará disponível no momento certo. Ao escrever manualmente xaml, eu ainda tendem a usá-lo o tempo todo. Mas, dada a produtividade que você ganha com um designer gerar seu XAML na mistura, qualquer pequeno ganho de desempenho que você pode obter provavelmente não vale a pena a sobrecarga de manter tudo como estático.

Outras dicas

Diz -se que há uma diferença de desempenho, mas se é "significativo" dependerá de quantas pesquisas dinâmicas estão acontecendo. A menos que você tenha milhares de referências dinâmicas de origem, provavelmente não será perceptível de qualquer maneira; Se os recursos dinâmicos tenham tido um desempenho tão pior que os estáticos, suspeito que a mistura seja mais conservadora em gerá -los.

De fato, quando fiz um teste ingênuo, achei o resultado contra -intuitivo que o dinâmico source correu mais rápido do que o StaticResource (com 3000 referências de recursos, vi tempos de carga em torno de 200 ms quando usei o DynamicResource para tudo em torno de 400ms para o staticResource).

Este foi um teste irrealista por inúmeras razões: todas as referências eram da mesma coisa, eu estava correndo sob o depurador, etc. etc. Mas sugere que seria prematuro se esforçar para alterar a saída da mistura "apenas no caso" - - e que, se você notar uma desaceleração, pode não ser necessariamente culpa das referências dinâmicas - sempre medir!

Infelizmente, se você alterar os recursos dinâmicos de volta para a estática, ele quebrará a mistura. Isso parece ser verdade, especialmente ao usar o UserControls que referenciam recursos dinâmicos, se você alterá -los para estático, o controle não será renderizado quando hospedado em outro controle na mistura.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top