WPF Rendering 3(硬件加速、软件加速)之:Performance profiling-Perforator
第三天(11/17/2010)
step 3: Practice
1. 找一个Animation的demo(要求绚一点的,像素丰富,并将动画速度调快,以提高画面显示难度),在其中加入一个计时器,每隔一段时间修改当前进程的RenderOptions.ProcessRenderMode, 代码如下:
Timer timer = new Timer();
timer.Interval = 500; //半秒改变一次
timer.Enabled = true;
timer.Elapsed += new ElapsedEventHandler(changeRenderMode);
timer.Start();
//执行动画
// 改变呈现方式的函数
void changeRenderMode(object sender, ElapsedEventArgs e)
{
if (RenderOptions.ProcessRenderMode == RenderMode.Default)
{
RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;
}
else
{
RenderOptions.ProcessRenderMode = RenderMode.Default;
}
}
2. 运行以上函数,并运行windows sdk 中的的工具:Performance profiling-Perforator,将以上进程加入到监视内容,可以看到类似以下效果:
从中我们可以看出software rendering 和hardware rendering的交替进行
3. 从实验来看,在程序运行的时候修改注册表的值(见前面的两篇文章)对程序的软硬件呈现没有影响,或许需要重启程序或者重启机器什么的?以后需要的时候再验证吧!
更正:
在上面的试验中,我曾以为修改注册表的值对rendering是没有影响的,后来发现这个想法是错误的。之所以在运行时修改注册表不会改变呈现方式(而不是像修改RenderingOption那样会立即改变呈现方式),是因为在窗口出现出来之前,应用程序只会读一次注册表的值,并以此为依据,也就是说,我们可以在窗口出现之前改变注册表的值来对呈现方式造成影响,而后在程序重启之前就没有机会再通过注册表改变了。例如,可以在App.cs中加入一下代码:
protected override void OnStartup(StartupEventArgs e)
{
//Enable hardware accelration
EnableHWAcceleration();
base.OnStartup(e);
}
//Change the RegistryKey value to enable hardware accelration
public void EnableHWAcceleration()
{
RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Avalon.Graphics\", true);
if (registryKey != null && registryKey.GetValue("DisableHWAcceleration").ToString() == "1")
{
registryKey.SetValue("DisableHWAcceleration", 0);
}
}
这样可确保电脑启用硬件加速,
同时,如果修改语句为:
registryKey.SetValue("DisableHWAcceleration", 1);
这样便禁用了硬件加速,在这种情况下,即使在程序中设置:
RenderOptions.ProcessRenderMode == RenderMode.Default;
这样也无法启用硬件加速(参考前一篇中关于优先级的内容)