[cairo] Best strategy for complex screen drawing

Timothée Lecomte timothee.lecomte at ens.fr
Fri Nov 25 09:07:11 PST 2005


Vladimir Vukicevic wrote:

>On 11/21/05, Timothée Lecomte <timothee.lecomte at ens.fr> wrote:
>  
>
>>Under X11 via gdk, I draw offscreen to a GdkPixmap thanks to
>>gtk_cairo_create(GdkPixmap*).
>>Then, I copy this pixmap to the screen with gdk_draw_drawable() when I
>>receive a "window-must-be-painted" event.
>>
>>With such code, the initial drawing takes approximately 0.2 milliseconds
>>per polygon (pretty slow), and the copy to the screen is almost satisfying.
>>    
>>
>That's pretty much what you should be doing; some future toolkits may
>allow you to directly draw into the back buffer of a widget and have
>the update happen automatically.(...)
>    - Vlad
>  
>
I have reviewed my code to see if there wasn't any bottleneck which
would not imply cairo, and ... I must conclude that cairo is slow even
with this implementation.

I have tried to compare the time needed to draw on a generic image
surface (cairo_image_surface_create_for_data), and on a GtkPixmap
surface obtained via gtk gdk_pixmap_new and gtk_cairo_create.

Here is a screenshot of what I am drawing :

http://tipote.free.fr/wxt15.png

The drawing is made of a few lines and pango text layouts, and 10000
4-corners polygons. Each polygon is drawn thanks to the following code :

    cairo_save(cr);
/* eventually disabling anti-aliasing for testing purpose */
//     cairo_set_antialias( cr, CAIRO_ANTIALIAS_NONE );

    cairo_move_to(cr, device_x(corners[0].x), device_y(corners[0].y));

    for (int i=1;i<n;i++)
        cairo_line_to(cr, device_x(corners[i].x), device_y(corners[i].y));

    cairo_close_path(cr);

    wxt_cairo_fill( fillstyle, fillpar ); /*set color depending on args*/

    cairo_fill_preserve(cr);
    cairo_set_line_width(cr, 1);
    cairo_stroke(cr);

    cairo_restore(cr);


The results are surprising :

"Generic" image surface :
* antialiasing enabled for the polygons = 1470 ms, or 0.15 ms per polygon
* antialiasing disabled for the polygons = 1200 ms, or 0.12 ms per polygon


GtkPixmap surface :
* antialiasing enabled for the polygons = 2200 ms, or 0.22 ms per polygon
* antialiasing disabled for the polygons = 1500 ms, or 0.15 ms per polygon

Yes, you've well read, the image surface is way more efficient !

I have verified in gtk sources to see if cairo_xlib_surface_create was
used, and yes, it's the case. So image surface are more efficient than
xlib ones !

Am I forgetting something ?

Best regards,
Timothée Lecomte




More information about the cairo mailing list