WPF performance and .NET Framework Client Profile related blogs provided by Jossef Goldberg.
As you know by default WPF uses Hardware acceleration (GPU) to render its content (aka Hardware rendering). In most cases rendering using Hardware (HW) acceleration is much more performant than rendering using Software. In some small cases SW rendering may be faster (E.g. low end graphics card sometimes found in Netbooks).
WPF will always attempt to use HW rendering, but in certain cases WPF will fall to Software rendering and the application may not be aware of it.Some folks wanted to better understand all the possible cases, so am I am listed these below.WPF will render in Software when:
Which tools can I use to detect if my app renders in Software?The easiest way is to use Perforator which is included with the WPF Performance Profiling Tools and check below check boxes. Read more here.
Option
Description
Draw software rendering with purple tint
Draws all areas rendered by using the software rendering pipeline with a purple tint. This includes software render targets, software 3D content, and per-primitive software fallback.
Draw software rendered bitmap effects with red tint
Draws legacy software rendered bitmap effects with red tint.
How can I detect if my app renders in Software in code?Check the RenderingCapability.Tier . You can also listen on the Tier change event.
You mentioned 'Note: these are absolute in NET4.'. Do you mean 'obsolete'?
thnx
I don't know how I missed the option to override the rendering mode on a per-window basis in 3.5 SP1. Some of our customers experience strange visual artifacting with our WPF applications, so that capability will be very useful. Thanks!
"In most cases rendering using Hardware (HW) acceleration is much more performant than rendering using Software. In some small cases SW rendering may be faster (E.g. low end graphics card sometimes found in Netbooks)."
We have found that SW rendering is noticeably faster on Intel Atom CPUs, which only support rendering Tier 1--this is a HW limitation according to Intel. Do you know what class of graphics card is needed to get appreciably faster hardware rendering than software rendering? Would any of the Intel integrated graphics chips (e.g., the latest-gen graphics chip on the Core i3) be faster than SW rendering or do you have to go to a dedicated GPU?
Hi Ben
We don’t have a specific list of which GPUs are faster in SW. It depends on the other factors such as bus speed & architecture and your specific scenarios (e.g. you may find the even on your low-end GPU, 3D will be faster in HW).
We did hear that some customers complained about the Intel GMA500 performance found in some netbooks. I would still expect that most modern GPUs to perform much better in HW. Your best approach is to test.
Also note that there was some small changes to the Rendering Tier definitions in WPF 4.
(see: blogs.msdn.com/.../what-s-new-for-performance-in-wpf-in-net-4.aspx)
Thank you.
Jossef
Hi Jossef,
I'm experiencing a problem which seems to be related to your point #14. Maybe you could help me.
The context : 2 WPF apps (.NET 3.5 SP1) running on a dual-display XP Embedded machine (DirectX 9.0c)
At some point, one of these app freezes. But only the rendering : the GUI stays active (message pump is active, the application is responsive), but the rendering is not done.
The freeze can last seconds or forever.
The 2nd app keeps running normally. The bug occurs only in a dual-display configuration, the 2nd app being a kind of catalyst (more memory and CPU usage...)
Using Perforator, I see that Video Memory Usage is continuously going up & down in spikes (cf : www.hostingpics.net/viewer.php).
During that time, one native thread is consuming 100% of a CPU (the stack-trace involves WPFgfx, DirectX, GDI, and video driver)
Usually, when the app unfreeze, it's fully software rendered (purple tint with Perforator).
Also, de-activating hardware rendering unfreeze the app.
My conclusion, so far, is that I'm facing an out of video memory, with an attempt to fallback to software rendering, but there is a loop somewhere trying again in hardware mode.
What's your opinion ?
Would it be more a WPF problem, or a video driver problem ? or even DirectX ?
Are there some parameters I can tune around this ?
Thanks for your help.
I'm having problems with a WPF application and adaptive technology software (screen reader such as JAWS & screen magnifiers such as ZoomText). The problem is that these tools don't see any text on the WPF app window. These tools use mirror display drivers & DCM (display chain management) to capture the text that is rendered on the screen.
Reading your article, I thought that switching to software rendering (i.e. using GDI) could potentially resolve my problem. I added the related code: hwndTarget.RenderMode = RenderMode.SoftwareOnly;
and later tested with WPF Performance Profiling Tool. I got a completely purple tinted window.
Unfortunately, this hasn't resolve the problem. Screen readers & magnifiers still can not capture the test written on the screen.
Please correct me if my initial conclusion has been wrong.