5

特定の 2D ゲームのリプレイを見ることができるアプリケーションがあります。

基本的に、車両は地図上を移動しています。ビューは車両を中心にしているため、リプレイの再生中にマップがスクロールします。これは、Micro Machinesのようなものです (アイデアを提供するためのものであり、実際のゲームはMicro Machinesではありません)。


(出典: randomracket.com )

私のシーンでは、車両が動き回っている間、マップは静的です。ビューはリプレイのフレームごとにスクロールするため、車両が中央に表示されます。パフォーマンス上の理由から、マップは数QGraphicsPixmapItem秒でタイル表示されます。

ビューポート更新モードは に設定されていQGraphicsView::BoundingRectViewportUpdateます。アイテムのインデックス方法が に設定されていQGraphicsScene::NoIndexます。

ほとんどの場合、すべてが正常に機能しています。ただし、マップが通常よりも大きい場合、車両は更新されません。ビューはスクロールしており、タイルは適切に更新されています。ただし、ズームイン/ズームアウトしてビューポート全体の更新をトリガーしない限り (アイテムが適切に配置されていることがわかります)、車両ではありません。

ビークルの boundingRect は一度だけ設定され、有効です (論理座標で与えられた以下を参照)。アイテムのバウンディング rect の外側はペイントしません。

デバッグ出力の例 (3 番目の構成のみが機能しません):

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、以前のバージョンでも問題が発生しました

OS : Windows XP SP3、他の OS ではまだテストしていません

最小限の例で問題を再現することに成功しませんでした。最小限の例は、期待どおりに機能します。実生活では、次のことが行われます。

  1. マップはファイルから読み取られます。これは、地面/空を区切る最大数百のポリゴン (それぞれがポリゴン、エッジ、および頂点レイヤーでグラフィカルに作成されています)、地面または空にクリップされる数千の写真とテクスチャ、およびその他のアイテムで構成されています。

  2. すべてのクリッピングを計算し、QImage でシーンをレンダリングします。画像はシーンに追加されたいくつかの s でタイルQGraphicsPixmapItem表示されますが、以前のアイテムはシーンから削除されて削除されます (ところで、以前のアイテムを削除して削除しなかったときにもバグが発生しました)。

  3. リプレイ開始です

Qt グラフィックスの内部がめちゃくちゃになっていると思いますが、それを消去/リセットする方法がわかりません。

これはグラフィックの例です (地面/空の意味を説明するため)。マップは非常に巨大になる可能性があります。


(出典: kopasite.net )

4

2 に答える 2

3

答えとして上から私のコメントを拾います:

QGraphicsScene::invalidate(...)再描画する必要があるシーンの部分を無効にするために使用する必要があります。

于 2012-06-20T12:29:32.307 に答える
1

これは、多くの QGraphicsItems を操作するときに発生した問題に似ていると思います。最終的に、一度に画面に表示される QGraphicsItems の量を合理化し、キャッシュする必要のない QGraphicsItems をキャッシュしないようにすることで、問題を解決しました。

これが問題であるかどうかを確認する簡単な方法は次のとおりです。

vehicle->setCacheMode(QGraphicsItem::NoCache);

これにより、描画が必要になるたびに車両の paint メソッドが呼び出されるようになります。

于 2012-06-18T09:19:23.383 に答える