Comment 16 for bug 733912

Revision history for this message
Andrey Bondarenko (abone) wrote :

I'll test ppa8 version a bit later and get back with results, but I'm afraid it won't help.

I've tried to implement fix proposed by upstream myself based on ppa3 version (using gdk_cairo_rectangle + cairo_fill). Looks like it is cairo performance problem. The following implementation of on_expose function produces 20-30%CPU:

static gboolean on_expose(GtkWidget* widget, GdkEventExpose* evt, gpointer user_data)
{
    cairo_t *cr = gdk_cairo_create(evt->window);
    gdk_cairo_set_source_pixbuf (cr, bg_img, 0, 0);
    gdk_cairo_rectangle(cr, &evt->area);
    cairo_fill(cr);
    cairo_destroy(cr);
    return FALSE;
}

Falling back to deprecated api uses only 1-2% CPU (need -DGDK_ENABLE_DEPRECATED and -DGDK_PIXBUF_ENABLE_DEPRECATED compile flags):

static gboolean on_expose(GtkWidget* widget, GdkEventExpose* evt, gpointer user_data)
{
    GdkGC *gc = gdk_gc_new(evt->window);
    gdk_draw_pixbuf(evt->window,
                    gc,
                    bg_img,
                    evt->area.x, evt->area.y,
                    evt->area.x, evt->area.y,
                    evt->area.width, evt->area.height,
                    GDK_RGB_DITHER_NONE, 0, 0);
    g_object_unref(gc);
    return FALSE;
}

Looks like a new API 20-30 time slower than an old one. May be this was fixed in never versions of gdk. Here in maverick I have:

libgdk2.0-0 version 2.22.0-0ubuntu1
libgdk-pixbuf2.0-0 version 2.22.0-0ubuntu1
libcairo2 version 1.10.0-1ubuntu3