WPF应用程序 - 渲染性能

时间:2015-03-17 09:16:40

标签: c# wpf performance rendering hardware-acceleration

我目前正在开发Windows XP,7和8的应用程序。 为了测试这个应用程序,我使用了两台计算机。

启用硬件加速时:

  • 在第一台计算机上:应用程序非常流畅
  • 在第二台计算机上:应用程序非常慢

禁用硬件加速时:

  • 在第一台计算机上:应用程序有点慢
  • 第二台计算机:应用程序有点慢

因此,我想基于启动应用程序的计算机禁用硬件加速。为此,我目前正在使用以下代码:

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        //Try to improve performances
        int renderingTier = (RenderCapability.Tier >> 16);
        if(renderingTier < 2)
        {
            RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;
        }
    }
}

问题是两台计算机都有RenderingTier = 2.这就是我想替换

的原因
        if(renderingTier < 2)
        {
            RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;
        }

通过

        if(renderingTier < 2 || Something())
        {
            RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;
        }

你能帮我找到功能&#34; Something()&#34; ? 谢谢。

2 个答案:

答案 0 :(得分:3)

为什么不让用户决定他/她是否想要使用硬件或软件渲染,而不是硬编码?只需在应用程序中包含一个用户可以切换的设置。

它简化了您的任务,最重要的是,您无需硬编码选择其中一个的标准。

除此之外:在构建渲染控件之前,它还可能有助于找出 为什么 渲染性能很慢,看看是否可以改进它。< / p>

答案 1 :(得分:0)

        /// <summary>
    /// Reduce CPU Consumption for WPF Animations according to computer performance
    /// WPF draws animations at 60 frames per second. You can reduce this to a lower optimal rate, resulting in less CPU usage.
    /// </summary>
    /// <param name="fps"></param>
    private void Optimize()
    {
        int displayTier = (RenderCapability.Tier >> 16);

        if (displayTier < 2) // No hardware acceleration
        {
            RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;
            Timeline.DesiredFrameRateProperty.OverrideMetadata(typeof(Timeline), new FrameworkPropertyMetadata { DefaultValue = 24 });
        }
        else // Supports hardware acceleration
        {
            RenderOptions.ProcessRenderMode = RenderMode.Default;
            Timeline.DesiredFrameRateProperty.OverrideMetadata(typeof(Timeline), new FrameworkPropertyMetadata { DefaultValue = 60 });
        }          
    }