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

35

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

我记得有一个调用可以确定这一点,但现在找不到它了。

此外,是否有一种简单、基于代码的方法来强制选择其中一种渲染管道?

7个回答

39

检查RenderCapability.Tier

[更新]

  • 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并检查了它的值吗? - JohnIdol
1
我没有得到你列出的RenderingCapability.Tier(0、1、2)中的任何值 - 我得到了131072! - JohnIdol
8
好的,需要将 16 位进行移位操作 --> RenderCapability.Tier >> 16 - JohnIdol
更多关于这两个问题的信息可以在这里找到:http://stackoverflow.com/questions/3060329/system-windows-media-rendercapability-tier-returns-not-the-render-mode 我认为这可能会帮助那些还没有使用过.net4并且需要检查渲染模式的人们。 - HCL
嘿,实际上是 RenderCapability 而不是 RenderingCapability :-) - Jonathan ANTOINE
我已经更新了MSDN链接,指向.NET 4.0版本,因为当前版本(无版本号)的链接已经失效——微软似乎已经删除了.NET 4.5+的文章。 - Bob

13

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

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

查看此文章以获取更多信息。


1
如果我们生活在一个完美的世界,这是不必要的,但对于真实世界的部署场景,这是我们需要提供的其中之一。当在大型显示器上最大化运行应用程序时,使用较差的显卡会导致出现黑线和不流畅的情况,此功能可以解决这个问题。谢谢! - Adam Caviness

7
也许以下内容可以帮助您解决第二个问题,即是否可以强制使用一种渲染管道:
您可以更改注册表设置以禁用硬件加速,并始终强制进行软件渲染。我们经常使用此功能来查看我们正在遇到的特定问题是否与视频驱动程序有关。有关我所说的示例,请参见此WPF论坛帖子
这里需要注意的一个明显的事情是... 这会影响所有 WPF 应用程序,真正应该仅用于测试目的。
要禁用硬件加速:
[HKEY_CURRENT_USER\Software\Microsoft\Avalon.Graphics]
"DisableHWAcceleration"=dword:00000001

启用硬件加速:

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

查看此MSDN链接以获取更多信息。


6

基于 RenderingTier 链接,以下是一些代码:

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

我仍在测试和开发中。请查看未来的编辑/答案,了解我找到的内容。


4

或者使用性能分析工具...

新增复选框,用于着色目标应用程序元素,这些元素使用SW渲染的传统位图效果。


1
链接似乎重定向到通用的 WPF 文档。 - Drew Noakes

2

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

我制作了一个简单的应用程序,使用画布和旋转矩形的RotateTransform,对于一个使用硬件渲染的应用程序来说,它消耗了太多的CPU。并且'RenderCapability.Tier'值为2,因此有足够的硬件能力来完成它。

为什么还没有实现呢?


1

回答你问题的后半部分,我认为没有真正的方法可以强制使用一种方式而不是另一种方式。如果可用,硬件渲染会自动使用,否则就使用软件渲染。

如果您需要在软件模式下进行测试,则需要使用低规格的计算机或使用远程桌面查看在另一台计算机上运行的应用程序。除了性能/帧速率降低之外,两者之间在外观上不应该有任何可见差异。使用RenderCapability类来确定是否应禁用动画或效果以获得更好的性能。


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