0

私はこのコードを使用します:

MainLoop() {
    for (int i = 0; i < length; i++) {
        XMVector3Rotate(rays[i], orientation);
    }
}

私はfps1900000を持っていますが、これを使用すると:

MainLoop() {
    for (int i = 0; i < length; i++) {
        calculatedRays[i] = XMVector3Rotate(rays[i], orientation);
    }
}

私はfps=200です。なぜですか?

4

3 に答える 3

7

あなたがこれをしているとき:

XMVector3Rotate(rays[i], orientation);

コンパイラーは関数をインライン化すると推測しています-そして、その結果はどこにも割り当てられないため、実際に何も行わず、関数呼び出しを完全に削除します。実際には何もしていないので非常に高速です。

ただし、割り当てを追加すると、次のようになります。

calculatedRays[i] = XMVector3Rotate(rays[i], orientation);

突然、大量のメモリの読み取りと書き込み、およびさまざまな数学演算を実行します。これらはすべて、以前はスキップされていました。

(このXNAにタグを付けましたが、これはC++関数です。ほとんどのC++コンパイラーは、このような関数をインライン化できます。また、インライン化する予定です。標準のC#コンパイラーはできません。)

于 2011-05-10T15:25:31.053 に答える
2

最初の例では、関数の結果はすぐに破棄されます(割り当てられていません)。コンパイラはそれを感知するのに十分賢く、メソッド呼び出しを省略します...

于 2011-05-10T15:25:28.230 に答える
0

XMVector3RotateがXNAVector3タイプを返すと仮定すると、これは構造体のコピー操作になり、パフォーマンスが比較的高くなります。

自分のXNAゲームをXBox360用に最適化するときに、そのような操作の多くをrefparamsタイプに置き換え、重いループで非常に目立つゲインを実現しました。

編集:例(メモリから)

Vector3 vec1 = something, vec2 = something, result;
Vector3.Add(ref vec1, ref vec2, out result);
于 2011-05-10T15:19:00.093 に答える