WPF Rendering 1(硬件加速、软件加速)
Plan:
Area: Graphics Title: Rendering
Scenario:
1. Use software rendering
2. Use hardware rendering
3. Iterate
Stress Attack Point:Memory leak – Graphics rendering leaking Failure: Out of memory
Estimated Time: 2010/11/15-2010/11/19
First day(2010/11/15)
step 1: Material search
1. About DirectX http://baike.baidu.com/view/15762.htm
2. WPF Graphics Rendering Overview http://msdn.microsoft.com/zh-cn/library/ms748373.aspx
3. Optimizing Performance: Taking Advantage of Hardware http://msdn.microsoft.com/zh-cn/library/bb613578.aspx
4. WPF 性能分析工具 http://msdn.microsoft.com/zh-cn/library/aa969767(VS.90).aspx
5. Graphics Rendering Registry Settings
http://msdn.microsoft.com/zh-cn/library/aa970912.aspx
Main point:
禁用硬件加速选项
注册表项 |
值类型 |
---|---|
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Avalon.Graphics\DisableHWAcceleration |
DWORD |
使用禁用硬件加速选项,可以出于调试和测试的目的而关闭硬件加速。在应用程序中看到呈现项目时,尝试关闭硬件加速。如果项目消失,则视频驱动程序可能有问题。
“禁用硬件加速选项”是一个等于 0 或 1 的 DWORD 值。如果值为 1,则禁用硬件加速。假如系统满足硬件加速要求,则值 0 将启用硬件加速;有关更多信息,请参见图形呈现层。
6. How do you determine if WPF is using Hardware or Software Rendering?
Main point:
logger.InfoFormat("WPF Tier = {0}",RenderCapability.Tier / 0x10000);
RenderCapability.TierChanged +=
(sender, args) => logger.InfoFormat("WPF Tier Changed to {0}",
RenderCapability.Tier / 0x10000);
7. What’s New for Performance in WPF in .NET 4
http://blogs.msdn.com/b/jgoldb/archive/2010/04/12/what-s-new-for-performance-in-wpf-in-net-4.aspx
Main point: New API to allow WPF apps to force SW rendering per process
In NET 3.5 SP1 we added new API to allow developers to force software rendering per application window instead of using the GPU (see my Performance improvements in WPF in .Net 3.5 / 3.0 SP1 blog), in NET 4 you can now do so for the entire process.
As reported (see here), depending on the machine configuration and the application, software-based rendering is sometimes faster than hardware.
This could improve rendering performance for certain scenarios and machines configuration, in most cases Hardware rendering should perform better. Please use carefully and verify with your app and machine configuration.
In certain cases apps may want to use Software rendering for reliability reasons, for example on machines (typically older) that do not have reliable drivers.
This APIs should provide developers a much better alternative than setting the global ‘Disable HW Acceleration’ registry key (see
here)
VS 2010 for example is using this feature to force VS 2010 into Software rendering on VMs thus improving reliability. VS 2010 is doing so since some VMs graphic emulation drivers found VS 2010 is doing so since some VMs graphic emulation drivers found not to be reliable. Here is an example for how to use this API:
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
if (WeThinkWeShouldRenderInSoftware())
RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;
}
}
Notes:
I) The precedence order for software rendering is:
- DisableHWAcceleration reg key
- RenderOptions.ProcessRenderMode (per process)
- HwndTarget.RenderMode (per-target / window)
II) The app force Software rendering at any time, however there is no way to force Hardware rendering back on once it was set to SoftwareOnly.
8. System.Windows.Media.RenderCapability.Tier returns not the render mode
Main point:
HwndSource hwndSource = PresentationSource.FromVisual(visual) as System.Windows.Interop.HwndSource;
RegistryKey Class
HwndTarget hwndTarget = hwndSource.CompositionTarget;
hwndTarget.RenderMode = renderMode;
9.
http://msdn.microsoft.com/en-us/library/microsoft.win32.registrykey.aspx