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;

这样也无法启用硬件加速(参考前一篇中关于优先级的内容)

 

posted on 2010-11-17 19:12  I过T  阅读(1939)  评论(0编辑  收藏  举报

导航