タイルで満たされた巨大な長方形のグリッドを想像してください。個々のタイルはあまり複雑ではなく、少量の形状を含むSVG画像です。QMLで巨大なタイルを扱う方法は?
非常に大きくないタイルの種類の数は、私は低いと推定します。しかし、グリッドは非常に大きくなる可能性があるため、タイルの総数は膨大です(少なくとも数万、おそらくそれ以上)。
グリッドを水平方向と垂直方向にスムーズにスクロールできるだけでなく、スムーズにズームイン/ズームアウトできるようにする必要があります。私はまた、特定の位置にジャンプすることができなければなりません。
私は非同期的に、最初に実際に表示されている要素、残りの要素を取り込めるといいですね。つまり、最初にループ内に行と列を追加する必要があるテーブル処理クラスは、開始位置が必ずしも左上隅ではないため、最適な解決策ではありません。
ズームは、スケーリング係数の倍数として指定されたタイル内の項目のすべてのプロパティを持つことによって簡単に達成されます。 svg
は、異なるイメージの数が多くないため問題にはなりません。キャッシュできる必要があります。万一、svg
がボトルネックになった場合、異なる解像度の異なるpng
のセットを使用できます。
Iは、以下のアプローチを試みた(または考え):動的(Component.createObject
)をQMLオブジェクトを作成、SameGame exampleの方法を用いて
を。これは、オブジェクトの数が少ないが、多数のオブジェクトで非常に遅い場合に機能します。オブジェクトが完全に空であっても、このメソッドはvery long timeになります。
Flickable
の中にRepeater
を使用する。Flickable
にはGrid
が含まれ、Repater
が入力されています。もちろん、Grid
は莫大です。 このメソッドは、オブジェクトを動的に作成するよりも高速ですが、タイルの数が増えるにつれて効率的ではありません。 QMLエンジンは、表示されていないアイテムも含め、すべてのアイテムを追跡します。すべてのアイテムのプロパティが目に見えるものだけでなく再計算されるので、ズームも非常に遅いです。GridView
を使用する。一見したところ完璧なソリューションのようです。GridView
はFlickable
を継承し、ビューの範囲内にあるコンテンツのみを表示するようにも注意します。何百万ものsvgイメージを持つテストケースでさえ、合理的に高速で実行され、スムーズにスクロールしてサイズを変更します。問題は1つだけです:GridView
は、水平または垂直のいずれかでフリッキングできますが、両方ではありません。 2012年以来これについてfeature requestがありましたが、まだ無視されているようです。QGraphicsView
を直接使用する。必要な量の要素を表示、スクロール、ズームすることはis capableですが、QMLベースではありません。私の残りのGUIはQMLであり、QML
とQGraphicsView
を組み合わせるという恐怖の話しか読まなかった。私はそれの合理的な例を見たことがない。
その他の解決策はありますか?Flickable
の中を移動している間に、単純なGridLayout
の行と列を追加したり削除したりするためにJavascriptを使用するという恐ろしいハック(いくつかの行と列は可視領域よりも大きい)または、OpenGLウィンドウを埋め込み、すべてを手動で描画するだけですか?
私はこれが不可能な仕事ではないことを願っています。 20年以上前にDOSやWindows 95用に書かれた戦略ゲームで、この量のタイルを扱うことができました。テクスチャとアニメーションが追加されました。
DOSとWindows 95との比較は、基礎となる技術とアプローチが大きく異なるため、意味をなさない。必要なものを実行するカスタムのQtQuick要素を使用しないのはなぜですか? – peppe
@peppe:私の論点はシステム自体ではありませんでしたが、200倍少ない計算能力でそれを行うことができました。そして「カスタムQtQuick要素」によって、自分の2Dグラフィックスエンジンを最初から実装する必要があることを意味しますか?はい、可能ですが、そのアプローチはOpenGL描画ソリューションに似ています。 'GridView'はいつ、何をロードしてアンロードするのかを知る利点がありました。すべてをゼロから行うことで、私は自分のメモリ管理、可視性の計算などを実装する必要があります。私が最初からすべてを実装しなければならないのなら、なぜQtを使うのですか? – vsz
あなたは今日でも完全に可能ですが、10000要素のリピーターは間違ったアプローチです。このような組み込みのものがQMLに欠けているということは、実現不可能というわけではありません。 – peppe