Одна из проблем заключается в том, что вы снова и снова рисуете один и тот же базовый объект. Я не уверен в поведении буферизации GTK +, но также имейте в виду, что вызовы основных функций требуют затрат в Python. Я добавил счетчик кадров в вашу программу, и я с вашим кодом, я получил около 30 кадров в секунду макс.
Есть несколько вещей, которые вы можете сделать, например, составить более крупные контуры перед фактическим вызовом любого метода заполнения или обводки (т.е. все дуги будут за один вызов). Другое решение, которое намного быстрее, - это скомпоновать свой шар в закадровый буфер, а затем просто многократно рисовать его на экране:
def create_basic_image():
img = cairo.ImageSurface(cairo.FORMAT_ARGB32, 24, 24)
c = cairo.Context(img)
c.set_line_width(4)
c.arc(12, 12, 8, 0, 2 * math.pi)
c.set_source_rgb(1, 0, 0)
c.stroke_preserve()
c.set_source_rgb(1, 1, 1)
c.fill()
return img
def expose(sender, event, img):
cr = darea.window.cairo_create()
for i in range(num):
cr.set_source_surface(img, x[i], y[i])
cr.paint()
... # your update code here
...
darea.connect("expose-event", expose, create_basic_image())
Это дает около 273 кадров в секунду на моей машине. Из-за этого вам следует подумать об использовании gobject.timeout_add
вместо idle_add
.