5

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

基本上,车辆在地图上移动。视图以车辆为中心,因此地图在回放时滚动,类似于Micro Machines(这只是为了提供一个想法,实际游戏不是Micro Machines)。


(来源:randomracket.com

在我的场景中,当车辆四处移动时,地图是静态的。回放的每一帧视图都在滚动,因此车辆居中。出于性能原因,地图在几个QGraphicsPixmapItems 中平铺。

视口更新模式设置为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

我试图调试一个更新通道,并且油漆事件确实排除了车辆所在的区域......

任何人都知道为什么更新可能会错过特定项目?

编辑 :

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

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

我没有成功地用一个最小的例子重现这个问题。最小的例子就像预期的那样工作。在现实生活中,这是完成的:

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

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

  3. 重播开始了

我认为 Qt Graphics 内部搞砸了,但我不知道如何清理/重置它。

这是一个图形示例(说明我所说的地面/天空的意思)。地图可能非常巨大。


(来源:kopasite.net

4

2 回答 2

3

从上面拿起我的评论作为答案:

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

于 2012-06-20T12:29:32.307 回答
1

我相信这类似于我在使用大量 QGraphicsItems 时遇到的问题。我最终通过简化我在屏幕上的 QGraphicsItems 数量来解决我的问题,并且不缓存不需要缓存的 QGraphicsItems。

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

vehicle->setCacheMode(QGraphicsItem::NoCache);

这应该会导致每次需要绘制车辆上的油漆方法时都会被调用。

于 2012-06-18T09:19:23.383 回答