Pergunta

Estou de benchmarking um aplicativo WPF em várias plataformas e eu preciso de uma maneira fácil de determinar se WPF está usando hardware ou prestação software.

Se bem me lembro uma chamada para determinar isso, mas não posso colocar minhas mãos sobre ele no momento.

Além disso, existe uma maneira fácil, código base para forçar um pipeline de processamento sobre o outro?

Foi útil?

Solução

Verifique a RenderCapability.Tier

[ Atualizar ]

  • RenderCapability.IsPixelShaderVersionSupported -. Obtém um valor que indica se a versão de pixel shader especificado é suportado
  • RenderCapability.IsShaderEffectSoftwareRenderingSupported - Obtém um valor que indica se o sistema pode tornar bitmap efeitos em software.
  • RenderCapability.Tier - Obtém um valor que indica o nível de renderização para o segmento atual.
  • RenderCapability.TierChanged - Ocorre quando a camada de renderização mudou para o objeto Dispatcher do segmento atual.

RenderCapability.Tier >> 16

  • Renderização de Nível 0 - Sem aceleração de hardware gráfico. O nível de versão DirectX é inferior a versão 7.0.
  • Renderização de nível 1 - gráficos parciais aceleração de hardware. O nível de versão DirectX é maior do que ou igual a versão 7.0, e menor do que a versão 9.0.
  • Rendering Tier 2 - A maioria dos recursos gráficos usar aceleração de hardware gráfico. O nível de versão DirectX é maior ou igual a versão 9.0.

Outras dicas

.NET 4.0 fornece a capacidade de processamento de software vigor em código:

public partial class App : Application 
{    
    protected override void OnStartup(StartupEventArgs e)    
    {         
        if (WeThinkWeShouldRenderInSoftware())            
            RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;    
    }
}

Veja este post para obter mais informações.

Com base na ligações RenderingTier , aqui está algum código:

        logger.InfoFormat("WPF Tier = {0}",RenderCapability.Tier / 0x10000);
        RenderCapability.TierChanged +=
            (sender, args) => logger.InfoFormat("WPF Tier Changed to {0}",
                                                RenderCapability.Tier / 0x10000);

Eu ainda estou testando e trabalhando nisso. Veja futuras edições / respostas para o que eu acho.

Talvez o seguinte pode ajudar com a segunda parte da sua pergunta, ou seja, você pode forçar um pipeline de processamento em detrimento de outro:

Você pode alterar a configuração do Registro para a aceleração de hardware desativar e software força de processamento para ocorrer em todos os momentos. Muitas vezes usamos isso para ver se uma determinada questão que estamos vendo ... está relacionado com drivers de vídeo. Como um exemplo do que eu estou falando sobre ver este WPF fórum pós .

Uma coisa óbvia a nota aqui embora ... é que isso afeta todas aplicativos WPF e realmente só deve ser usado para fins de teste.

Para a aceleração de hardware disable:

[HKEY_CURRENT_USER\Software\Microsoft\Avalon.Graphics]
"DisableHWAcceleration"=dword:00000001

Para ativar a aceleração de hardware:

[HKEY_CURRENT_USER\Software\Microsoft\Avalon.Graphics]
"DisableHWAcceleration"=dword:00000000

Confira este MSDN ligação para mais informações.

Ou use as ferramentas Profiling ...

Nova caixa foi adicionada para tingir os elementos de aplicação alvo de que o uso SW rendeu legados efeitos de bitmap.

Eu agreee com a segunda resposta, mas que apenas diz algo sobre a capacidade da máquina para executar usando HW prestação não se o aplicativo é realmente hw prestados.

Eu fiz um aplicativo simples usando uma tela e apenas girando um retângulo com RotateTransform usa forma de muito CPU para um aplicativo hw prestados. Isso e o valor 'RenderCapability.Tier' é 2 por isso não é o suficiente capacidade de hw para fazê-lo.

Por que não, então?

Para atender a segunda metade da sua pergunta, não há nenhuma maneira eu acredito que realmente forçar um caminho sobre o outro. renderização por hardware é usada automaticamente se disponível, caso contrário, o software é.

Se você precisa testá-lo em modo de Software, você vai precisar usar uma máquina de especificação baixa ou usar o Remote Desktop para ver o aplicativo em execução em outro computador. Além de desempenho reduzido / framerate no entanto, não deve haver quaisquer diferenças visíveis na aparência entre os dois. Use a classe RenderCapability saber se você deve desativar coisas como animação ou efeitos em favor da performance.

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