32

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

我似乎想起了一个电话来确定这一点,但我现在不能动手。

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

4

7 回答 7

36

检查 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 版。
于 2008-09-29T17:39:21.500 回答
13

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

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

有关更多信息,请参阅此帖子

于 2010-05-19T15:56:04.933 回答
6

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

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

我仍在测试和解决这个问题。有关我发现的内容,请参阅未来的编辑/答案。

于 2008-09-29T18:26:47.143 回答
6

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

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

不过,这里要注意的一件显而易见的事情是……这会影响所有WPF 应用程序,并且实际上应该仅用于测试目的。

要禁用硬件加速:

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

要启用硬件加速:

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

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

于 2008-10-01T14:27:35.483 回答
4

或者使用分析工具...

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

于 2008-09-29T18:14:45.237 回答
1

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

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

于 2008-10-01T06:20:28.667 回答
1

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

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

那为什么不呢?

于 2009-07-17T09:35:33.153 回答