[Gtk-sharp-list] Drawing pixbufs to screen FAST..

Federico Mena Quintero federico@ximian.com
Tue, 18 Jan 2005 08:50:54 -0600


On Thu, 2004-12-30 at 16:40 +0000, Eto wrote:

> I am creating a console-like application that updates small parts of the 
> display on the fly.  I generate the character in a pixbuf, then draw that to 
> the screen. (I need to do this because the character definitions are 
> completely customizable).  This is done in a background thread.
> 
> The slow part is not generating the pixbuf, but rather, drawing it to screen.  
> In windows, this is extreemly fast and works like a charm.  
> 
> I am not scaling the image or anything, just using the Drawable.DrawPixbuf 
> method to output to screen (though, I would still like to be able to scale 
> the output).

Some things to keep in mind:

- Do your pixbufs have an alpha channel?  Due to the current
implementation in the X server of the RENDER extension, they may not go
through accelerated paths.

- If you'll be drawings many little pixbufs, it may be faster to
composite them onto a larger pixbuf without an alpha channel, and send
that to your window with DrawPixbuf().  Download the gtk-sharp sources
and see gtk-sharp/sample/GtkDemo/DemoPixbuf.cs, which makes a nice
animation.

- You may want to turn off double-buffering for your widget and handle
exposures yourself.  EOG has a good example of a non-double-buffered
image widget that is quite fast.

- Can you pre-generate server-side pixmaps out of your pixbufs and keep
them around?  That way they are likely to live in video memory, and
blitting will be very fast.

If you have a web page or something that shows what you are trying to do
in your program, we may be able to come up with more concrete
suggestions.

  Federico