2017년부터 PyQt5로 개발하고 있는 어플리케이션이 있습니다.
QGraphicsScene/QGraphicsView를 이용하여 그래픽을 화면에 표시하고 있는데 Scene에 들어가는 객체의 수가 적으면 어느정도 성능이 나오는데 일정 수준 이상으로 객체가 늘어가네 되면 성능이 급격히 떨어지는 현상이 발생하였습니다.
이러한 현상을 디버깅하는 도중에 객체나 Scene/View의 변동 사항이 없어도 paint() 함수가 반복적으로 호출하는 현상을 찾았습니다.
그 현상의 원인은 paint() 함수 내부에서 객체를 수정하는 로직때문이었습니다.
- def paint(self, painter, option, widget):
- # override paint method
- color = self.getColor()
- self.setColor(color) # --> 여기서 객체를 수정하고 있음
- painter.setPen(self.pen())
- painter.drawLine(self.line())
- if self.isSelected():
- painter.setOpacity(0.7)
- painter.setPen(QPen(Qt.black, 1.5, Qt.DashLine))
- painter.setBrush(QEngineeringLineItem.HIGHLIGHT_BRUSH)
- painter.drawPolygon(self.minimum_bounding_box)
이 부분을 수정하고 나니 전체 프로그램의 성능이 조금 올라갔습니다.
paint() 함수는 객체를 화면에 표현만 하도록 해야하고,
내부에 객체를 수정하는 로직을 넣지 않는것이 좋습니다.
댓글
댓글 쓰기