您如何确定 WPF 使用的是硬件渲染还是软件渲染?

Posted

技术标签:

【中文标题】您如何确定 WPF 使用的是硬件渲染还是软件渲染?【英文标题】:How do you determine if WPF is using Hardware or Software Rendering? 【发布时间】:2010-09-14 01:36:39 【问题描述】:

我正在各种平台上对 WPF 应用程序进行基准测试,我需要一种简单的方法来确定 WPF 是使用硬件还是软件呈现。

我似乎记得有一个电话来确定这一点,但我现在不能动手。

另外,有没有一种简单的、基于代码的方法来强制一个渲染管道在另一个渲染管道上?

【问题讨论】:

【参考方案1】:

检查 RenderCapability.Tier

Graphics Rendering Tiers RenderCapability Class

[更新]

RenderCapability.IsPixelShaderVersionSupported - 获取一个值,该值指示是否支持指定的像素着色器版本。 RenderCapability.IsShaderEffectSoftwareRenderingSupported - 获取一个值,该值指示系统是否可以在软件中渲染位图效果。 RenderCapability.Tier - 获取一个值,该值指示当前线程的渲染层。 RenderCapability.TierChanged - 在当前线程的 Dispatcher 对象的渲染层发生更改时发生。

RenderCapability.Tier >> 16

渲染层 0 - 没有图形硬件加速。 DirectX 版本级别低于 7.0 版。 渲染层 1 - 部分图形硬件加速。 DirectX 版本级别高于或等于 7.0 版,低于 9.0 版。 第 2 层渲染 - 大多数图形功能都使用图形硬件加速。 DirectX 版本级别高于或等于 9.0 版。

【讨论】:

您是否在运行时以编程方式调用 Rendering.Tier 并检查值? 我没有得到您为 RenderingCapability.Tier (0, 1, 2) 列出的任何值 - 我得到 131072! OK 需要移位16位 --> RenderCapability.Tier >> 16 这两个问题的更多信息可以在这里找到***.com/questions/3060329/… 我认为这可能会帮助那些无法使用 .net4 并且必须检查渲染模式的人。 嘿,实际上是 RenderCapability 而不是 RenderingCapability :-)【参考方案2】:

或者使用Profiling Tools...

添加了新复选框来为使用 SW 渲染的旧位图效果的目标应用程序元素着色。

【讨论】:

链接似乎重定向到通用 WPF 文档。【参考方案3】:

基于RenderingTier links,下面是一些代码:

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

我仍在测试和解决这个问题。查看我发现的未来编辑/答案。

【讨论】:

【参考方案4】:

要回答您问题的后半部分,我认为没有办法真正强迫一种方式超越另一种方式。如果可用,将自动使用硬件渲染,否则使用软件。

如果您需要在软件模式下对其进行测试,则需要使用低规格机器或使用远程桌面查看在另一台计算机上运行的应用程序。然而,除了降低性能/帧率之外,两者之间的外观不应该有任何明显的差异。使用 RenderCapability 类来了解您是否应该禁用动画或效果等功能以提高性能。

【讨论】:

【参考方案5】:

也许以下内容可以帮助您解决问题的第二部分,也就是说,您能否强制一个渲染管道优于另一个渲染管道:

您可以更改注册表设置以禁用硬件加速并强制始终进行软件渲染。我们经常使用它来查看我们看到的特定问题......是否与视频驱动程序有关。作为我所说的例子,请参阅WPF forum post。

这里要注意的一个明显的事情是……这会影响所有 WPF 应用程序,并且确实应该仅用于测试目的。

禁用硬件加速:

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

启用硬件加速:

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

查看此MSDN link 了解更多信息。

【讨论】:

【参考方案6】:

我同意第二个答案,但这只是说明机器使用硬件渲染运行的能力,而不是应用程序实际上是硬件渲染的情况。

我使用画布制作了一个简单的应用程序,并且仅使用 RotateTransform 旋转一个矩形会占用大量 CPU 用于硬件渲染的应用程序。这和“RenderCapability.Tier”的值为 2,所以有足够的硬件能力来做到这一点。

那为什么不呢?

【讨论】:

【参考方案7】:

.NET 4.0 提供了在代码中强制软件渲染的能力:

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

更多信息请参见this post。

【讨论】:

+1 如果我们生活在一个完美的世界中,这不是必需的,但对于现实世界的部署场景,这是我们需要提供的东西之一。当在卡较差的大型显示器上运行应用程序最大化时,这实际上消除了所有黑线和断断续续的现象。谢谢!

以上是关于您如何确定 WPF 使用的是硬件渲染还是软件渲染?的主要内容,如果未能解决你的问题,请参考以下文章

如何确定 Qt 应用程序中使用的是哪个 OpenGL 引擎:软件还是硬件?

dotnet 读 WPF 源代码笔记 渲染收集是如何触发

dotnet 读 WPF 源代码笔记 渲染收集是如何触发

dotnet 读 WPF 源代码笔记 渲染收集是如何触发

慢速渲染WPF图表

测量 WPF 渲染的性能