[cairo] Why is my simple python gtk+cairo program running so slowly/stutteringly?

Chris Wilson chris at chris-wilson.co.uk
Sun Jan 31 11:31:19 PST 2010


On Sun, 31 Jan 2010 13:00:58 -0600, Rye Terrell <ryeterrell at ryeterrell.net> wrote:
> My program draws circles moving on the window. I think I must be missing
> some basic gtk/cairo concept because it seems to be running too
> slowly/stutteringly for what I am doing. Any ideas? Thanks for any help!

You happen to be drawing the same sprite 128 times, asking for full 
subpixel tessellation of the nigh on the saem geometry 384 times per
expose. This is where a canvas and scenegraph are so valuable. But for
this simple case:

#!/usr/bin/env python

import gtk
import gtk.gdk as gdk
import math
import random
import gobject

# The number of circles and the window size.
num = 128
size = 512

# Initialize circle coordinates and velocities.
x = []
y = []
xv = []
yv = []
for i in range(num):
    x.append(random.randint(0, size))
    y.append(random.randint(0, size))
    xv.append(random.randint(-4, 4))
    yv.append(random.randint(-4, 4))


# Draw the circles and update their positions.
def expose(*args):
    r = 8
    lw = 4
    c = int (r + (lw+1)/2 + 1)

    cr = darea.window.cairo_create()
    cr.rectangle(0, 0, 2*c, 2*c)
    cr.clip()
    cr.push_group()

    # draw the circle sprite
    cr.set_line_width(lw)
    cr.set_source_rgb(1, 0, 0)
    cr.arc(c, c, r, 0, 2 * math.pi)
    cr.stroke_preserve()
    cr.set_source_rgb(1, 1, 1)
    cr.fill()

    p = cr.pop_group()
    cr.reset_clip()

    for i in range(num):
        cr.save()
        cr.translate(x[i] - c, y[i] - c)
        cr.set_source(p)
        cr.paint()
        cr.restore()

        x[i] += xv[i]
        y[i] += yv[i]
        if x[i] > size or x[i] < 0:
            xv[i] = -xv[i]
        if y[i] > size or y[i] < 0:
            yv[i] = -yv[i]

# Self-evident?
def timeout():
    darea.queue_draw()
    return True

# Initialize the window.
window = gtk.Window()
window.resize(size, size)
window.connect("destroy", gtk.main_quit)
darea = gtk.DrawingArea()
darea.connect("expose-event", expose)
window.add(darea)
window.show_all()

# Self-evident?
gobject.idle_add(timeout)
gtk.main()

-- 
Chris Wilson, Intel Open Source Technology Centre


More information about the cairo mailing list