如何提高 QGraphicsView 在具有许多项目的 2D 静态场景中的性能? (没有办法解决吗?)
如果理解正确,QGraphicsView 应该能够有效地处理数百万个项目。
在我的应用程序中,我只有几千个,性能已经很糟糕了。当视图显示整个场景时,缩放、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_())
- Intel(R) Xeon(R) CPU E5410 @ 2.33GHz
- nVidia Corporation G84 [Quadro FX 1700]
- Ubuntu 9.04 64 位
- qt4 4.5.3
- python-qt4 4.6
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
基本上,您可以使用的是缓存模式和更新模式,还有场景的 bsp 树的大小。此外,DevDays 2010 的这篇演讲还提供了一些提示和技巧:http://qt.nokia.com/developer/learning/online/talks/developerdays2010/tech-talks/qt-graphics-view-in-deep 。
Basically, what you can play with are cache modes and update modes, but also the size of the bsp-tree of the scene. Also, this speech from DevDays 2010 gives some hints and tips: http://qt.nokia.com/developer/learning/online/talks/developerdays2010/tech-talks/qt-graphics-view-in-depth .