2011-01-21 2 views
0

QGraphicsView가 올바르게 이해된다면 효율적으로 백만 가지 항목을 처리 할 수 ​​있습니다.많은 항목이있는 2D 정적 장면에서 QGraphicsView 성능을 향상시키는 방법은 무엇입니까? (해결할 방법이 없습니까?)

내 응용 프로그램에는 몇 천 개 밖에 없지만 성능이 이미 매우 나쁩니다. View가 전체 장면을 보여줄 때, 확대, hoverEnvents 및 다른 것들은 불가능하게됩니다.

항목과 다른 최적화 플래그간에 상위 - 하위 관계를 만들려고 시도했지만 여전히 동일한 결과가 나타납니다. 나는 정말로 바보 같은 실수를하기를 바란다. 그러나 며칠 후에 문제를 해결할 방법을 찾고 나서 해결책을 찾지 못했다.

정말 도움이됩니다.

내 문제 재생 :

import sys 
import random 
from PyQt4.QtGui import * 

NO_INDEX = False 
OPTIMIZE = False 
ITEM_COORD_CACHE = False 
ITEM_DEVICE_CACHE = False 
NESTED_ITEMS = False 


class TestItem(QGraphicsEllipseItem): 
    def paint(self, painter, option, index): 
     return QGraphicsEllipseItem.paint(self, painter, option, index) 

    def hoverEnterEvent (self, e): 
     self.setBrush(QBrush(QColor("orange"))) 

    def hoverLeaveEvent(self,e): 
     self.setBrush(QBrush(None)) 

if __name__ == '__main__': 
    n = int(sys.argv[1]) # Number of items. With 5000 I already 
          # have performance problems 
    app = QApplication(sys.argv) 
    scene = QGraphicsScene() 

    # Populates scene 
    prev = None 
    for i in xrange(n): 
     # Random geometry and position 
     r1 = random.randint(10, 100) 
     r2 = random.randint(10, 100) 
     x = random.randint(0, 500) 
     y = random.randint(0, 500) 

     item = TestItem(x, y, r1*2, r2*2) 
     item.setAcceptsHoverEvents(True) 

     if NESTED_ITEMS: 
      # Creates a parent child structure among items 
      if not prev: 
       scene.addItem(item) 
      else: 
       item.setParentItem(prev) 
      prev = item 
     else: 
      scene.addItem(item) 

     if ITEM_COORD_CACHE: 
      item.setCacheMode(QGraphicsItem.ItemCoordinateCache) 
     elif ITEM_DEVICE_CACHE: 
      item.setCacheMode(QGraphicsItem.DeviceCoordinateCache) 

    # Creates View 
    view = QGraphicsView(scene) 
    # Sets basic Flags for nice rendering 
    view.setRenderHints(QPainter.Antialiasing or QPainter.SmoothPixmapTransform) 

    if NO_INDEX: 
     view.setItemIndexMethod(QGraphicsScene.NoIndex); 

    if OPTIMIZE: 
     view.setOptimizationFlags(QGraphicsView.DontAdjustForAntialiasing 
            or QGraphicsView.DontClipPainter 
            or QGraphicsView.DontSavePainterState) 

    view.show() 
    sys.exit(app.exec_()) 
  • 인텔 (R) 제온 (R) CPU의 E5410에 @의 2.33GHz
  • 엔비디아 G84 [쿼드 FX 1700]
  • 우분투 9.04 64 비트
  • QT4 4.5.3
  • 파이썬 QT4 4.6
,536,913,632 10
+0

최근 PyQt5.7에서 시도해 보았을 때 성능에 영향이 없었으며 CPU가 빠르며 50,000 개의 타원이 보였습니다. 나는 이제 Qt가 더 좋았고, 문제가 해결되면 다르게 해결 될 것 같다. – Trilarion

답변

관련 문제