WPF应用程序-渲染性能

3
我正在开发一款适用于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;
        }

by

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

你能帮我找到函数“Something()”吗? 谢谢。


你真的可以仅基于两台电脑就得出它运行缓慢是因为硬件加速的结论吗? - Mike Eason
请查看http://www.wpftutorial.net/10PerformanceTips.html,特别是第4条:_避免软件渲染。通过将AllowsTransparency设置为true或使用旧的BitmapEffects来使用透明窗口可能会导致WPF在Windows XP上以软件方式呈现UI,这会使其变得更慢。_ - Tseng
谢谢Tseng提供这个链接。事实上,我已经看过这篇文章了。我的应用程序没有BitmapEffects,并且AllowsTransparency属性被设置为false。 - user4633966
@MikeEason,不,实际上我已经在更多的电脑上测试过这个应用程序。我只是想通过这种方式简化情况。 - user4633966
2个回答

4

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

这简化了您的任务,最重要的是,您不必为选择其中一种而硬编码您的标准。

除此之外:在构建渲染控制之前,找出为什么渲染性能缓慢,看看是否可以改进它,可能也会有所帮助。


事实上,我想两者都做到:提供禁用硬件加速的选项,并提供检测最佳渲染模式的选项。关于性能方面,当禁用硬件加速时,由于我使用了一些动画效果,应用程序会有点慢。如果可能的话,我不想删除它们。 - user4633966
如果您想检测最佳渲染模式,那么我建议基于报告的 RenderCapabilities.Tier 进行判断。显然,这是微软认为确定使用哪种渲染模式的相关手段。它会查询各种 DirectX 和视频卡属性(请参阅 https://msdn.microsoft.com/en-us/library/ms742196(v=vs.110).aspx)。我并不认为自己比微软更懂。 - Willem van Rumpt

1
        /// <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 });
        }          
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接