我有一个应用程序,您可以在其中观看给定 2D 游戏的回放:
基本上,车辆在地图上移动。视图以车辆为中心,因此地图在回放时滚动,类似于Micro Machines(这只是为了提供一个想法,实际游戏不是Micro Machines)。
(来源:randomracket.com)
在我的场景中,当车辆四处移动时,地图是静态的。回放的每一帧视图都在滚动,因此车辆居中。出于性能原因,地图在几个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
我试图调试一个更新通道,并且油漆事件确实排除了车辆所在的区域......
任何人都知道为什么更新可能会错过特定项目?
编辑 :
Qt:4.8.1,我也看到了以前版本的问题
操作系统:Windows XP SP3,尚未在其他操作系统上测试
我没有成功地用一个最小的例子重现这个问题。最小的例子就像预期的那样工作。在现实生活中,这是完成的:
地图是从文件中读取的。它由多达数百个界定地面/天空的多边形(每个多边形以图形方式由多边形、边和顶点层组成)、数千张图片和纹理组成,然后将其剪裁到地面或天空,以及其他一些项目。
我计算所有剪辑,然后在 QImage 中渲染场景。图像在添加到场景中的几个 s 中平铺
QGraphicsPixmapItem
,而以前的项目从场景中删除并删除(顺便说一下,当我没有删除和删除以前的项目时,也会出现错误)。重播开始了
我认为 Qt Graphics 内部搞砸了,但我不知道如何清理/重置它。
这是一个图形示例(说明我所说的地面/天空的意思)。地图可能非常巨大。
(来源:kopasite.net)