【问题标题】:WPF Application - Rendering performancesWPF 应用程序 - 渲染性能
【发布时间】:2023-03-19 02:40:01
【问题描述】:

我目前正在为 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;
        }

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

【问题讨论】:

  • 您真的可以得出结论,它运行缓慢是因为仅基于 2 台 PC 的硬件加速吗?
  • 查看wpftutorial.net/10PerformanceTips.html,特别是#4:防止软件渲染。通过将 AllowsTransparency 设置为 true 或使用旧的 BitmapEffects 来使用透明窗口可能会导致 WPF 在 Windows XP 上的软件中呈现 UI,这会慢得多。
  • 感谢 Tseng 提供此链接。其实这个帖子我已经看过了。我的应用程序没有 BitmapEffects 并且 AllowsTransparency 属性设置为 false。
  • @MikeEason,不,实际上我已经在更多 PC 上测试了该应用程序。我只是想通过这种方式来简化情况

标签: c# wpf performance rendering hardware-acceleration


【解决方案1】:

与其硬编码,不如让用户决定他/她是想使用硬件渲染还是软件渲染?只需在您的应用程序中包含一个用户可以切换的设置。

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

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

【讨论】:

  • 事实上,我想两者都做:提供一个禁用硬件加速的选项,还提供一个检测最佳渲染模式的选项。关于性能,由于我使用了一些动画,当硬件加速被禁用时,应用程序有点慢。如果可能,我不想删除它们。
  • 如果你想检测最好的渲染模式,那么我会根据报告的RenderCapabilities.Tier来做。显然,微软认为这是确定使用何种渲染模式的相关手段。它会参考各种 DirectX 和视频卡属性(请参阅msdn.microsoft.com/en-us/library/ms742196(v=vs.110).aspx)。我不认为比微软更了解。
【解决方案2】:
        /// <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 });
        }          
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多