你怎么确定如果WPF是使用硬件或软件渲染?
题
我制定基准WPF应用在各种平台上,我需要一个简单的方法来确定如果WPF是使用硬件或软件渲染。
我似乎回想起一个电话,以确定这一点,但不能躺在我的手上现在。
此外,有没有一个简单、码基础的方式,强迫一个呈现管道?
解决方案
检查RenderCapability.层
- http://msdn.microsoft.com/library/ms742196(v=与100).aspx
- http://msdn.microsoft.com/en-us/library/system.windows.media.rendercapability_members.aspx
[更新]
- RenderCapability.IsPixelShaderVersionSupported -得到一个价值,表明是否指定像素的色器版本的支持。
- RenderCapability.IsShaderEffectSoftwareRenderingSupported -获取指示系统是否可以呈现bitmap影响的软件。
- RenderCapability.层 -得到一个值得指示渲染层的前线。
- RenderCapability.TierChanged -发生时呈现层发生了变化调度程序的目的在前线。
RenderCapability.层>>16
- 呈现层0 -没有图形硬件加速。该direct x版本的水平低于7.0版.
- 渲染的第1层 -部分的图形硬件加速。该direct x版本的水平大于或等于7.0版,并低于9.0版.
- 呈现2级 -最图形设有使用图形硬件加速。该direct x版本的水平大于或等于9.0版.
其他提示
.NET 4.0提供了在代码中强制进行软件渲染的功能:
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
if (WeThinkWeShouldRenderInSoftware())
RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;
}
}
参见这篇文章了解更多信息。
基于 RenderingTier链接,这里有一些代码:
logger.InfoFormat("WPF Tier = {0}",RenderCapability.Tier / 0x10000);
RenderCapability.TierChanged +=
(sender, args) => logger.InfoFormat("WPF Tier Changed to {0}",
RenderCapability.Tier / 0x10000);
我还在测试和研究这个问题。请参阅我发现的未来编辑/答案。
也许以下内容对您问题的第二部分有帮助,也就是说,您是否可以强制使用一个渲染管道而不是另一个:
您可以更改注册表设置以禁用硬件加速并强制软件呈现始终发生。我们经常使用它来查看我们看到的特定问题是否与视频驱动程序有关。作为我所谈论的一个例子,请参阅 WPF论坛帖子。
这里要注意的一件显而易见的事情是......这会影响所有 WPF应用程序,并且实际上只应用于测试目的。
禁用硬件加速:
[HKEY_CURRENT_USER\Software\Microsoft\Avalon.Graphics]
"DisableHWAcceleration"=dword:00000001
启用硬件加速:
[HKEY_CURRENT_USER\Software\Microsoft\Avalon.Graphics]
"DisableHWAcceleration"=dword:00000000
有关详细信息,请查看此 MSDN链接。
或使用资料分析工具 ......
添加了新的复选框以对使用SW渲染的旧版位图效果的目标应用程序元素进行着色。
我同意第二个答案,但这只是说明了如果应用程序实际上是hw渲染,机器使用hw渲染运行的能力。
我使用画布创建了一个简单的应用程序,只需使用RotateTransform旋转一个矩形,就可以为一个hw渲染的应用程序使用多个CPU。那个和'RenderCapability.Tier'值是2,所以有足够的hw能力来做它。
为什么不呢?
为了回答你问题的后半部分,我无法真正相信另一方面。如果可用,则自动使用硬件渲染,否则,软件是。
如果您需要在软件模式下进行测试,则需要使用低规格机器或使用远程桌面查看在另一台计算机上运行的应用程序。然而,除了性能/帧速率降低之外,两者之间的外观不应有任何明显差异。使用RenderCapability类来了解是否应禁用动画或效果等内容以支持性能。