0

リスト内の項目のインデックスを見つける最速の方法を知りたいです。私が知りたい理由は、私は XNA レンダーを作成しているのですが、頂点バッファーのみを使用したときに大規模なモデルでメモリ不足の例外が発生し始めたため、インデックス バッファー システムを実装したためです。私の問題は、すべての Vector3 を含むリストを継続的にスキャンして、インデックス バッファーに次に配置したいもののインデックスを取得する必要があることです。現在、次のようなインデックスをスキャンしています。

        for (int i = 1; i < circleVect.Length; i++)
        {
            indices.Add(vertices.FindIndex(v3 => v3 == circleVect[i]));
            indices.Add(vertices.FindIndex(v3 => v3 == circleVect[i - 1]));
            indices.Add(vertices.FindIndex(v3 => v3 == middle));
        }

これは、かなり遅いという事実を除いて、正常に機能します。1 つの円柱を計算するのに約 1 秒かかり、私の大規模なモデルには 70 000 を超える円柱があります。そのため、大きなモデルをロードしている間、ロード画面が 20 分以上表示されていましたが、まだ完了していません。残念ながら、これは単に受け入れられません。小さいモデルをロードしようとすると、5 分以上かかりますが、インデックス化されていないローダーはわずか 1 秒ほどしかかかりませんでした。

私は C# の正式なトレーニングはまったく受けておらず、XNA のトレーニングもほとんど受けていないため、これはおそらくインデックスを計算する非常に非効率的な方法であることを知っています。

PS。必要に応じてリストを配列に変更できますが、システム メモリに負荷がかかる可能性があり (例外が発生する)、かなりのコーディングが必要になるため、これは最後の手段となります。

4

4 に答える 4

0

主なパフォーマンス キラーは、70,000 の操作を必要とする 70,000 項目のリストを検索することです。これは、リストで検索するよりもはるかに高速に機能します。

 Dictionary<int, Vertice> vertices = new Dictionary<int, Vertice>();

            for (int i = 1; i < vertices.Length; i++)
            {
                if (vertices.ContainsKey(vertices[i]))
                {
                    indices.Add(vertices[i]);
                }
                if (vertices.ContainsKey(vertices[i - 1]))
                {
                    indices.Add(vertices[i - 1]);
                }
                if (vertices.ContainsKey(vertices[middle]))
                {
                    indices.Add(vertices[middle]);
                }
            }

編集: リストの検索に 2 秒かかる場合、辞書の検索には 00:00:02 秒かかります

于 2013-06-07T15:54:12.417 に答える
0
for (int i = 1; i < circleVect.Length; i++)
{
    for (int j = 0; j < vertices.Count; j++)
    {
        var v3 = vertices[j]; 
        if (v3 == circleVect[i] || v3 == circleVect[i - 1] || v3 == middle)
            indices.Add(j);
    }
}

3 つすべてのインデックスが見つかった後で、内部ループのチェックを停止するロジックを追加することを検討することをお勧めします。

于 2013-06-07T15:52:17.493 に答える
0

コードでは、FindIndex 行ごとに頂点を 3 回ループしています。代わりに for ループとトラバースを使用して、3 つの条件すべてを 1 回でチェックします。

于 2013-06-07T15:44:24.293 に答える