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

时间:2008-09-29 17:29:00

标签: wpf rendering pipeline

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

我似乎回想起了一个确定这一点的电话,但现在不能把它放在手上。

此外,是否有一种简单的,基于代码的方法来强制一个渲染管道而不是另一个?

7 个答案:

答案 0 :(得分:34)

检查RenderCapability.Tier

[<强>更新

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

RenderCapability.Tier&gt;&gt; 16

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

答案 1 :(得分:11)

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

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

有关详细信息,请参阅this post

答案 2 :(得分:6)

基于RenderingTier links,这里有一些代码:

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

我还在测试和研究这个问题。请参阅我发现的未来编辑/答案。

答案 3 :(得分:6)

也许以下内容对您问题的第二部分有帮助,也就是说,您是否可以强制使用一个渲染管道而不是另一个:

您可以更改注册表设置以禁用硬件加速并强制软件呈现始终发生。我们经常使用它来查看我们看到的特定问题是否与视频驱动程序有关。作为我所谈论的一个例子,请参阅此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了解详情。

答案 4 :(得分:4)

或使用Profiling Tools ...

  

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

答案 5 :(得分:1)

为了回答你问题的后半部分,我无法真正相信另一方面。如果可用,则自动使用硬件渲染,否则,软件是。

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

答案 6 :(得分:1)

我同意第二个答案,但这只是说明了如果应用程序实际上是hw渲染,机器使用hw渲染运行的能力。

我使用画布创建了一个简单的应用程序,只需使用RotateTransform旋转一个矩形,就可以为一个hw渲染的应用程序使用多个CPU。那个和'RenderCapability.Tier'值是2,所以有足够的hw能力来做它。

为什么不呢?