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