ZoomableCanvas http://blogs.msdn.com/b/kaelr/archive/2010/08/11/zoomableapplication2-a-million-items.aspxを実装しています
これは、キャンバス内のオブジェクトの仮想化表示を可能にする WPF コントロールです。仮想化を利用するには、ライブラリでデータソース オブジェクトに「Query」というメソッドを実装する必要があります。Query メソッドは Rect を指定すると IEnumerable<int> を遅延して返します。ここで、int は要素のデータソース内の位置を表し、Rect はキャンバスの表示領域です (キャンバスに表示されない項目は返されないため、描画されません)。 . 私のデータ ソースは、X 値と Y 値が並べ替えられるように並べ替えられます (myList[0] には最小の X、Y 座標が含まれます)。
この情報があれば、次のようにしてアイテムを取得できます
int c = this.Count;
for (int j = 0; j < c; j++)
{
if (rectangle.Contains(new Point(this[j].left, this[j].top)))
{
yield return (int)j;
}
}
ただし、リスト全体をトラバースしており、リストには 10 万以上のアイテムがあります。これは、特にキャンバスの右下を表示する場合、これらのアイテムがリストの最後にあるため、パフォーマンスが著しく低下します。
そこで、データを転置して、キャンバス上の可視領域のポイントを取得し、配列内で対応するインデックスを正確に把握できるようにしました。
var tilewidth = MapWidthInTiles;
for (var x = Math.Max(left, 0); x <= right; x++)
{
for (var y = Math.Max(top, 0); y <= bottom; y++)
{
var i = (y * tilewidth) + x;
if (i < Count)
{
yield return (int)i;
}
}
}
これは、マップに「タイル」が欠落しているか不完全である可能性があるため、データセットが不規則である(マップを描いている)ことを除いて機能します。したがって、私の配列は本質的にギザギザです。
基本的に、2D 配列の要素が完全ではないか連続していない可能性がある 1D 配列の 2D ジオメトリを指定して、要素をすばやく識別できる方法を探しています。通常、[y * widthOfAllItems] + x は、適切な 2d -> 1d 転置を提供します。しかし、要素が欠落しているため、方程式は外れています。どんな助けでも大歓迎です!