QGraphicsScene缺少特定的项目更新

时间:2012-06-14 16:54:34

标签: c++ qt qgraphicsview qgraphicsscene

我有一个应用程序,您可以在其中观看给定2D游戏的重放:

基本上,车辆正在地图上移动。视图以车辆为中心,因此地图在播放重放时滚动,某些 Micro Machines 类似(这只是为了给出一个想法,实际的游戏不是 Micro Machines )。

http://www.randomracket.com/images/genesis-gems/micromachines.jpg

在我的场景中,当车辆四处移动时,地图是静止的。视图正在滚动每个重播帧,以便车辆居中。 出于性能原因,地图会平铺在多个QGraphicsPixmapItem s。

视口更新模式设置为QGraphicsView::BoundingRectViewportUpdate。 项目索引方法设置为QGraphicsScene::NoIndex

在大多数情况下,一切正常。但是当地图比平时大时,车辆不会更新。视图滚动并且图块更新;但不是车辆,除非我通过放大/缩小来触发完整的视口更新(所以我知道项目位置很好)。

车辆的boundingRect永久设置一次,并且有效(参见下面,以逻辑坐标给出)。我不会在项目的边界矩形之外绘画。

调试输出的一些示例(仅第三种配置不起作用):

ok :
vehicle->boundingRect() : QRectF(-1.9391,-1.9391 3.8782x3.8782)
scene->sceneRect() : QRectF(-117.543,-38.3826 138.834x40.3217)
SCENE_CACHING : 85 tiles

ok :
vehicle->boundingRect() : QRectF(-2.88489,-2.88489 5.76979x5.76979)
scene->sceneRect() : QRectF(-68.8843,-18.2202 187.989x119.277)
SCENE_CACHING : 308 tiles

nok : vehicle won't update
vehicle->boundingRect() : QRectF(-3.45546,-3.45546 6.91092x6.91092)
scene->sceneRect() : QRectF(-64.2988,-107.802 188.927x187.445)
SCENE_CACHING : 506 tiles

我尝试调试更新传递,而paint事件确实排除了车辆所在的区域......

任何人都知道更新可能会错过某个特定项目的原因吗?

修改:

Qt:4.8.1,我也看到过以前版本的问题

操作系统:Windows XP SP3,尚未在其他操作系统上进行测试

我没有成功用最小的例子来重现问题。最小的例子就像预期的那样工作。在现实生活中,这是做了什么:

  1. 从文件中读取地图。它由多达数百个界定地面/天空的多边形组成(每个多边形图形由多边形,边缘和顶点层组成),数千个图片和纹理然后被剪切到地面或天空,以及其他一些项目。

  2. 我计算了所有剪辑,然后在QImage中渲染场景。图像以几个QGraphicsPixmapItem平铺添加到场景中,而前一个项目从场景中删除并删除(当我没有删除和删除以前的项目时,也会发生错误。)

    < / LI>
  3. 重播已启动

  4. 我认为Qt Graphics的内部结构搞砸了,但我无法弄清楚如何清理/重置它。

    以下是图形示例(用于说明地面/天空的含义)。地图可能非常庞大。

    http://kopasite.net/up/0/example.jpg

2 个答案:

答案 0 :(得分:3)

从上面提出我的评论作为答案:

您需要使用QGraphicsScene::invalidate(...)使应重绘的场景部分无效。

答案 1 :(得分:0)

我认为这与我在处理大量QGraphicsItems时遇到的问题类似。我最终通过简化我在屏幕上的QGraphicsItem的数量来解决我的问题,并且不缓存不需要缓存的QGraphicsItems。

检查这是否是您的问题的简单方法是:

vehicle->setCacheMode(QGraphicsItem::NoCache);

每次需要绘制时,应该调用车辆上的绘画方法。