Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » [PyQt4] Производительность QGraphicsScene [RSS Feed]

#1 Авг. 5, 2010 13:37:00

Gifts
От:
Зарегистрирован: 2010-08-01
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

[PyQt4] Производительность QGraphicsScene

Требуется отслеживать перемещения и собственно перемещать большое количество картинок/точек (пик - 25000). Ну и неплохо бы, хотя бы для части отслеживать коллизии. Тестовая машина обладает слабым процессором (селерон 2ГГц)

Пока играюсь с примером collidingmice.

1) Вынес QTimer из класса mouse в сцену и привязываю события таймаута к каждой мыши. Что избавляет от подергиваний и мыши движутся куда резвее. Где-то 30-40 мышей может двигаться относительно без тормозов. Процессор нагружен на 40%. Собственно код:

    scene.timer = QtCore.QTimer() 
for i in xrange(MouseCount):
mouse = Mouse()
mouse.setPos(math.sin((i * 6.28) / MouseCount) * 200,
math.cos((i * 6.28) / MouseCount) * 200)
scene.timer.timeout.connect(mouse.timerEvent)
scene.addItem(mouse)
scene.timer.start(1000/33)
2) Добавляю кеширование в инициализацию класса Mouse - self.setCacheMode(QtGui.QGraphicsItem.ItemCoordinateCache) Свободно перемещаются до 120 мышей, процессор нагружается на 80%. Но перестает работать обнаружение столкновений, что, конечно, ожидаемо, но неприятно
3) Наконец удаляю всю математику из метода timerEvent. Оставляю только:
    def timerEvent(self):
self.speed += (-50 + QtCore.qrand() % 100) / 100.0

dx = math.sin(QtCore.qrand() % (360 * 16)) * 10
self.mouseEyeDirection = [dx / 5, 0.0][QtCore.qAbs(dx / 5) < 1]

self.rotate(dx)
self.setPos(self.mapToParent(0, -(3 + math.sin(self.speed) * 3)))
1200 мышек начинают шустро бегать по сцене, но до требуемых 25к это не дотягивает даже близко. Получается нужно хоть сколь бы сложные вычисления выносить в модули СИ? :/ Но как связать методы PyQt, и собственный сишный модуль

Теперь собственно вопросы:
1) Что еще можно докрутить, чтобы увеличить скорость работы/количество перемещаемых объектов? (купить новую машину не предлагать)
2) Понимаю что “математика” из timerEvent неоптимизирована, хотя бы потому что каждая мышка сравнивается с очень большим количеством соседних. И повторов сравнений многовато. Какая методика будет правильнее для данного случая?
3) Какие объекты на сцене весят меньше всего, то есть какие объекты эффективнее всего двигать без потери качества?
4) Вижу еще проблему - каждая мышь двигается последовательно (вроде бы), возможно стоит вычислять следующую позицию всех элементов, а потом одним действием их перерисовывать на сцене. Возможно ли такое?



Офлайн

  • Начало
  • » GUI
  • » [PyQt4] Производительность QGraphicsScene[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version