[cairo] Best strategy for complex screen drawing

Bill Spitzak spitzak at d2.com
Mon Nov 21 12:43:56 PST 2005



Timothée Lecomte wrote:

> 1) Would it be more efficient to use a gdk/cairo surface for the screen
> (via gdk_cairo_create) and use cairo_set_source_surface to copy the
> image surface to the screen ? (instead of the image buffer conversion) I
> suppose the answer is no.
> 
> 2) Would it be more efficient to use a specific backend ? For example,
> should I draw to an offscreen Xlib pixmap, and use it as a source
> surface ? Will I benefit from possible render acceleration ?
> 
> 3) Are there other solutions that I might have forgotten ?

What you want is double buffering, or backing store, or offscreen 
rendering, or any of a dozen other names. This should be provided by the 
system or the toolkit as some kind of modification to an existing window 
object.

You do not want to do your own "fake" double buffering by allocating 
some other object and doing explicit copies. The reason is that the 
"real" double buffering knows that the image and the window are 
explicitly linked, and can be setup to copy very fast, and it can take 
advantage of the fact that the backing store will not be used for any 
purpose other than to update the visible window. It can resize and 
delete it in sync with the real window, and free it if your window has 
not been displayed for a long time.

It is obvious to me that all future systems will always be in permanent 
double-buffered mode (again cryptically named, in X they call this the 
"composite extension" and in the Windows world they talk a lot about 
transparency, thought that is a trivial side effect). If this is true, 
unless a system is *very* clever and able to figure out that the extra 
buffer you are allocating is being used as a double buffer, then any 
attempts you make to create the double buffer will be a waste of time on 
them, and memory as *two* images will be created, and your code will 
copy from one invisible one to another, and then the system will copy 
from there to the screen window.

So the answer is: if you think you have to create two objects, that is 
wrong. Figure out a way so that there is one object per screen area. 
Examine your system and/or toolkit to find out how to turn this on. If 
it does not seem possible, you must switch toolkits.

You may also find that the toolkit provides the interface but internally 
it is using a pixmap just like you were going to. This is ok. It 
indicates the toolkit authors are thinking about the future and plan to 
rewrite this area, so you should plan for it by using their interface.


More information about the cairo mailing list