我在各种平台上对WPF应用程序进行基准测试,我需要一种简单的方法来确定WPF是使用硬件还是软件渲染.
我好像回忆起一个确定这个问题的电话,但现在不能把它放在手上.
另外,是否有一种简单的,基于代码的方式来强制一个渲染管道而不是另一个?
检查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层 - 无图形硬件加速.DirectX版本级别低于7.0版.
渲染第1层 - 部分图形硬件加速.DirectX版本级别大于或等于7.0版,小于9.0版.
渲染第2层 - 大多数图形功能都使用图形硬件加速.DirectX版本级别大于或等于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链接以获取更多信息.