question about bad cairo performance on the olpc xo

Tomeu Vizoso tomeu at sugarlabs.org
Fri Sep 3 04:28:57 EDT 2010


On Fri, Sep 3, 2010 at 07:49, Erik Blankinship <erikb at mediamods.com> wrote:
> I need help understanding why I am getting very poor frame rates when I use
> pycairo to move a large image around the screen on an olpc XO.  When I use
> pycairo to draw a rectangle of the same size on an XO, I get great
> performance!  This is confusing to me because in my experience on other
> platforms, redrawing vector graphics is much, much slower than blitzing
> bitmaps to the screen.
> Is there something particular about the XO hardware, its software stack, or
> cairo which retards the performance of displaying images?

I would run sysprof (or any other system-wide profiler) and see which
process and what code is taking most CPU.

Regards,

Tomeu

> The same test
> case runs fine on my desktop machine.
> Thank you!  Below is testing code and here is a link if you'd like to try it
> yourself in the gnome desktop on an XO (the same performance problems also
> occur when run as part of a sugar activity):
> http://alumni.media.mit.edu/~erikb/tmp/test.zip
> software notes: click to change the rectangle paint mode.   Green is a cairo
> vector rectangle.  Red-1 is a cairo image surface created by loading a png.
>  Blue is a cairo generated image_surface.  Red-1 is a gdk pixbuf created by
> loading a png.
>
>
> import gtk, gobject
>
> import cairo
>
> class DragTest( gtk.DrawingArea ):
>
>     __gsignals__ = {
>         "expose-event": "override",
>         "on-mouse-move": (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE,
> (gobject.TYPE_PYOBJECT,)),
>         "on-mouse-down": (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE,
> (gobject.TYPE_PYOBJECT,)),
>     }
>
>     def __init__(self):
>         gtk.DrawingArea.__init__(self)
>         self.set_events(gtk.gdk.POINTER_MOTION_MASK |
> gtk.gdk.BUTTON_PRESS_MASK)
>         self.connect("motion_notify_event", self.__on_mouse_move)
>         self.connect("button_press_event", self.__on_button_press)
>
>         self.box_w = 1210
>         self.box_h = 910
>
>         self.box_type = 0
>         self.box_x = 0
>         self.box_y = 0
>         self.cairo_img = cairo.ImageSurface( cairo.FORMAT_ARGB32,
> self.box_w, self.box_h )
>         ctx = cairo.Context( self.cairo_img )
>         ctx.set_source_rgb( 0, 0, 1 )
>         ctx.rectangle( 0, 0, self.box_w, self.box_h )
>         ctx.fill( )
>
>         self.cairo_file_img = cairo.ImageSurface.create_from_png( "bg.png" )
>
>         self.pixbuf = gtk.gdk.pixbuf_new_from_file( "bg.png" )
>
>
>     def __on_mouse_move(self, area, event):
>         self.box_x, self.box_y, mods = self.get_window().get_pointer()
>         self.queue_draw( )
>
>     def __on_button_press(self, area, event):
>         self.box_type += 1
>         if (self.box_type > 3):
>             self.box_type = 0
>         self.queue_draw( )
>
>
>     def do_expose_event(self, event):
>         context = self.window.cairo_create()
>
>         # clip to the visible part
>         context.rectangle(event.area.x, event.area.y,
>                           event.area.width, event.area.height)
>         context.clip()
>
>         if (self.box_type == 0):
>             context.set_source_rgb( 0, 1, 0 )
>
>         elif (self.box_type == 1):
>             context.set_source_surface( self.cairo_file_img, self.box_x,
> self.box_y )
>
>         elif (self.box_type == 2):
>             context.set_source_surface( self.cairo_img, self.box_x,
> self.box_y )
>
>         elif (self.box_type == 3):
>             context.set_source_pixbuf( self.pixbuf, self.box_x, self.box_y )
>
>
>         context.rectangle( self.box_x, self.box_y, self.box_w, self.box_h )
>         context.fill( )
>
>
> window = gtk.Window()
> window.set_size_request( 1210, 910 )
> window.connect( "delete_event", lambda *args: gtk.main_quit() )
> window.add( DragTest() )
> window.show_all()
> gtk.main()
>
>
>
> _______________________________________________
> Devel mailing list
> Devel at lists.laptop.org
> http://lists.laptop.org/listinfo/devel
>
>



More information about the Devel mailing list