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