【发布时间】:2010-09-14 01:36:39
【问题描述】:
我正在各种平台上对 WPF 应用程序进行基准测试,我需要一种简单的方法来确定 WPF 是使用硬件还是软件呈现。
我似乎记得有一个电话来确定这一点,但我现在不能动手。
另外,有没有一种简单的、基于代码的方法来强制一个渲染管道在另一个渲染管道上?
【问题讨论】:
我正在各种平台上对 WPF 应用程序进行基准测试,我需要一种简单的方法来确定 WPF 是使用硬件还是软件呈现。
我似乎记得有一个电话来确定这一点,但我现在不能动手。
另外,有没有一种简单的、基于代码的方法来强制一个渲染管道在另一个渲染管道上?
【问题讨论】:
检查 RenderCapability.Tier
[更新]
RenderCapability.Tier >> 16
【讨论】:
或者使用Profiling Tools...
添加了新复选框来为使用 SW 渲染的旧位图效果的目标应用程序元素着色。
【讨论】:
基于RenderingTier links,下面是一些代码:
logger.InfoFormat("WPF Tier = {0}",RenderCapability.Tier / 0x10000);
RenderCapability.TierChanged +=
(sender, args) => logger.InfoFormat("WPF Tier Changed to {0}",
RenderCapability.Tier / 0x10000);
我仍在测试和解决这个问题。查看我发现的未来编辑/答案。
【讨论】:
要回答您问题的后半部分,我认为没有办法真正强迫一种方式超越另一种方式。如果可用,将自动使用硬件渲染,否则使用软件。
如果您需要在软件模式下对其进行测试,则需要使用低规格机器或使用远程桌面查看在另一台计算机上运行的应用程序。然而,除了降低性能/帧率之外,两者之间的外观不应该有任何明显的差异。使用 RenderCapability 类来了解您是否应该禁用动画或效果等功能以提高性能。
【讨论】:
也许以下内容可以帮助您解决问题的第二部分,也就是说,您能否强制一个渲染管道优于另一个渲染管道:
您可以更改注册表设置以禁用硬件加速并强制始终进行软件渲染。我们经常使用它来查看我们看到的特定问题......是否与视频驱动程序有关。作为我所说的例子,请参阅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 了解更多信息。
【讨论】:
我同意第二个答案,但这只是说明机器使用硬件渲染运行的能力,而不是应用程序实际上是硬件渲染的情况。
我使用画布制作了一个简单的应用程序,并且仅使用 RotateTransform 旋转一个矩形会占用大量 CPU 用于硬件渲染的应用程序。这和“RenderCapability.Tier”的值为 2,所以有足够的硬件能力来做到这一点。
那为什么不呢?
【讨论】:
.NET 4.0 提供了在代码中强制软件渲染的能力:
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
if (WeThinkWeShouldRenderInSoftware())
RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;
}
}
更多信息请参见this post。
【讨论】: