2012-02-02 16 views
7

私はQtの中で、2Dタイルベースのゲームをプログラミングを開始し、2Dの多くを表示して処理するために意図されているQGraphicsSceneとQGraphicsViewクラスについて読みするつもりを使用してQtのタイルベースのゲームを始めようオブジェクト。はQGraphicsSceneとQGraphicsView

私の質問は、それはQGraphicsSceneを使用してタイルのたくさんの世界を作成することが可能になりますでしょうか?一度に全世界をタイル単位で追加することはできますか、それともその領域を少し制限するために何かを実装しようとすべきですか?私は、QGraphicsSceneが "何千ものアイテム"を扱うことができると読んだが、2Dタイルマップは実際には本当に大きくなる(200x200のタイルはそれほど多くはないが、それはすでに40,000のオブジェクトが多い)。

マップもかなり静的になるので、1つの大きなピクスマップとして描画することは可能かもしれませんが、これはQGraphicsSceneのすべての魅力的なものを、独立したアイテムなどのマウスクリックのように使用することを本当に防ぎます。その中で、タイルグリッドに合わせられないプレイヤー、NPCなどを描くつもりです。多くの静的オブジェクトとそれらの上にいくつかの動的オブジェクトを使用するためのいくつかの最適化のものがありますか?

は全くさえ良いアイデアQGraphicsSceneとQGraphicsViewを使用しているか、私はQtの内部の代替または多分異なる、より多くのゲーム指向のライブラリを探してみてください? QGraphicsSceneのみビューに表示されているものをペイントする能力を持っている

+0

だ、代わりにデフォルトのソフトウェアレンダラのレンダラとしてOpenGLを指定することで、パフォーマンスを大幅に向上させることが可能です: 'UI-> graphicsView - > setViewport(新しいQOpenGLWidget); ' – vsz

答えて

8

QGraphicsViewを使用する必要があります。

40,000 Chips int型はQtのドキュメントには、密接に調べるためにあなたの最もよい例です。それは、多数の要素の複雑さを扱い、複数の尺度でそれを描画します。

この例を試してみると、ズームアウトすればすべてのチップが実際に大きな写真になり、どのビューでも複数のチップを選択してドラッグアンドドロップすることができます個々のチップ上のいくつかのテキスト。各パーツを理解するには時間がかかりますが、これは非常に徹底した例です。

chips.cppソースでは、スタイルオプションに格納されている変換に基づいて "LevelOfDetail"ステートメントまたはlod変数switchステートメントを使用しても、どのようにすばやく実行できるかを示しています。

Qtのグラフィックスビューは、あなたの質問に話しました多くのことを行うために最適化されていますが、それはそれにアプローチする方法を理解するのに時間がかかります。

マップのサイズに問題が残っている場合は、ハードドライブにタイルレイアウトを保存し、必要なときに必要なものをロードし、必要のないレイアウトを削除します必要に応じてシーンの

+0

リンクが死んでいます。 – mrgloom

+0

リンクを修正しました。楽しい。 – phyatt

1

事前に

おかげで、他のすべては、ちょうどシーンインデックスに座っています。特定の用途を最適化するためにシーンとビューの動作を設定するためのさまざまなオプションがあります。あなたのシーンのインデックスに40kのタイルがあるからといって、それを多くペイントする必要があるわけではありません。あなたは実際にあなたのビューの解像度で表示されているものだけを持っています。あなたの項目が静的である場合に

はまた、その後、彼らは一度だけ計算する必要があり、ピックスマップキャッシュから取得することができ、キャッシングのオプションがあります。

最終的には、あなたの時間を完全に試してみる価値があると思います。非常に多数のタイルでシーンを作成し、そのビューをスクロールするだけでテストを模擬するのはかなり簡単です。あなたが持っているタイルの数に関心がありませんが、描かれている実際のビュー内のグラフィックスがどれほど複雑であるかを感じます。

+0

すばらしい答えをありがとう!私はそれを試してみるつもりです。あなたが言ったように、たとえそれがうまくいかなかったとしても、私はそれをやるのに膨大な時間を失ったようではありません。 – Maush

2

私は同様のプロジェクトに取り組んでおり、永続的なQGraphicsPixmapItemsの30x30グリッドを使用しています。マップのビューが変更されると、QGraphicssceneは現在表示されているマップ配列の部分を反復し、各タイルでsetPixmapを呼び出して新しいタイルタイプに変更します。それはかなりスムーズに動作しており、これまでのところパフォーマンスの不満はありません。

2

私は言ったことに同意します。私は何年も前からQGraphicsView-based gamesをやっていました(あなたがLinuxの場合は、パッケージマネージャーにKDiamondやPalapeliについて質問しています)。QGraphicsViewが初めて何年も前に出てきたときにレンダリングのパフォーマンスが問題になっていました。解決される。

あなたが気にする必要があるのはメモリ消費量です。チップの例には、タイルを付けたいと思うほど多くのチップがあるかもしれませんが、それらのチップはピクスマップとしてメモリに保持されません。各タイルは、固定サイズ50x50px画像であれば、それはすでにQtの最近のバージョンでは

32bits*50px*50px*200*200 = 381,9 MiB 
+0

ありがとう、Palapeliはとてもいいです。今、私はまだKDiamondを試しています... – CapelliC