How to draw graphics as efficiently as possible in WPF

Lennard Fonteijn picture Lennard Fonteijn · Sep 9, 2011 · Viewed 24.3k times · Source

I am creating a tool which relies heavily on graph-node trees. The current implementation is done in Java and I'm porting it to a generic code-base on C#, so it can be used by various rendering implementations and also because I want to use the power of WPF for a user-friendly interface.

After browsing around for a day, I came across various methods to draw Vector-graphics through WPF.

This guy speaks about different layers within WPF developers can choose from. As I want to use WPF PURELY for his rendering at first, I want to work on the "Visual Layer".

I then came across things like: DrawingVisual, GeometryDrawing, FrameworkElement / UIElement / Shapes

So, I'm a bit overwhelmed by all the different implementations that do eventually the same in totally different ways.

The Graph-Node library has been ported to C# already with all it's logic (including collision detection and dragging with mouse). As it is made with graphic-renderers in mind (like XNA, SlimDX, OpenTK, etc.), what would be the best way in terms of performance to implement a WPF renderer (as in, it will draw whatever the graph library tells it to draw?

Basically, the resulting WPF control acts as a canvas, but it has to be SUPER lightweight and not have any neat WPF features besides providing me a way to draw my circles, lines and other shapes :)

EDIT:

I basically want to know: What is the way to go? Do I extend Canvas as "Host" for my graphics and then add my custom implementation of a UIElement? Or can I have one class which can draw EVERYTHING (as in, one mega super ultra graphic). Much like overriding OnPaint in GDI or Paint-method in Java (which gives a Graphics object to do everything with).

Answer

Reed Copsey picture Reed Copsey · Sep 9, 2011

I'd recommend reading Optimizing Performance: 2D Graphics and Imaging (dead link -- readable via Internet Archive) -

Basically, Drawing objects will be lighter weight than Shapes, in general. This is probably what you want to use.