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

Rye Terrell ryeterrell at ryeterrell.net
Sun Jan 31 11:58:37 PST 2010


Thank you; that is tremendously faster.

-Rye

On Sun, Jan 31, 2010 at 1:31 PM, Chris Wilson <chris at chris-wilson.co.uk>wrote:

> 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.cairographics.org/archives/cairo/attachments/20100131/7c0cab88/attachment.htm 


More information about the cairo mailing list