Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Разработка GUI > Tk.Canvas : 1000 двигающихся объектов. Too slow.


Автор: yeputons 10.7.2010, 15:35
Проблема такова: мне требуется отобразить на Tkinter.Canvas очень много объектов (пусть даже 400). Объекты небольшие (закрашенные кружочки с радиусом 16 пикслей) и должны двигаться. Сейчас есть код, который в цикле for вызывает метод canv.coords(id, ...) для каждого объекта.
Уже на 150 кружочках ЦП грузится на 30% (Celeron 1.8GGz). Если двигать не все, а 10 кружочков, то загрузка - 5-6%. FPS требуется >= 24 (т.е. realtime)
Вопрос: как можно поднять производительность canvas.coords? Может, как-нибудь запретить перерисовку (на неё же всё тратится?) перед циклом и разрешить после?

Код для тестирования такой:
Код

#!/usr/bin/python
from Tkinter import *
import random

root = Tk()

canv = Canvas(root, width=640, height=480)
canv.pack()

canv.create_rectangle(0, 0, 640, 480, fill="white")

root.resizable(0, 0)

COUNT=150
elements=[]
for i in range(0, COUNT):
  elements.append(canv.create_oval(320 - 8, 240 - 8, 320 + 8, 240 + 8, fill="green"))

def tick():
  rem = 10
  for i in elements:
    canv.move(i, random.randrange(-4, 4), random.randrange(-4, 4))
    rem -= 1
    if rem <= 0: break
  root.after(40, tick)
tick()

root.mainloop()

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)