[cairo] Re: Gtk performance issues from a user's point of view

Federico Mena Quintero federico at ximian.com
Mon Oct 9 08:12:21 PDT 2006


On Mon, 2006-10-09 at 07:56 +0300, Kalle Vahlman wrote:

[old percentage for gtk_button_expose() was 24.88%]
> The new tesselator was supposed to be up to four times faster than the
> old one, but running the same test with the old one yields a different
> result:
> 
> _gtk_marshal_BOOLEAN__BOXED         0,05  33,43
>   gtk_button_expose                 0,00  10,91
>   scw_view_expose                   0,02  10,13
>   gtk_label_expose                  0,00   3,54
>   meta_frames_expose_event          0,00   3,16
> 
> also the path to tesselation seem very different, but that's probably
> to be expeceted...
> 
> So, now I toss the ball to Carl's corner; am I misinterpeting or is it
> a regression in the tesselator? Do the traces look plausible?

... But this is giving you percentages (did you expect 6%?), not
absolute timings.  Manu's theme torturer may give you more useful
numbers here - it actually gives you timings.

In particular, the torturer makes it easy to plug arbitrary widgets and
get timings when they are exposed/resized/etc.  You may want to plug
your whole complex window and see what it tells you.

> But the second expose pair shows something which feels to me as a
> mistake. The first expose is for the new area of the window. This
> makes a full redraw in my test case anyway, even if the clipping mask
> is set. The second is for the full window area, which of course means
> we'll draw it again making the first draw totally unneccesary.
> 
> I'm guessing this is so (assuming it's intentional) in order to make
> the empty space fill up faster and only after that fill the rest. But
> then it would make sense to get the later expose only to the part that
> wasn't already updated, not to the whole widget.
> 
> And if you think about it, how many widgets actually are cabable of
> drawing like that without drawing the whole thing twice?

If your widget is smart enough, you may want to experiment with
gtk_widget_set_redraw_on_allocate(w, FALSE).  When the widget gets
resized, that will give you expose events only for the new area, not for
the old one.

  Federico



More information about the cairo mailing list