0

我使用这段代码:

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

我有 fps 1900000,但是当我使用这个时:

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 返回一个 XNA Vector3 类型,这将是一个结构复制操作,在性能上相对昂贵。

在为 XBox360 优化我自己的 XNA 游戏时,我用refparams 类型替换了许多这样的操作,在重循环中获得了非常明显的增益。

编辑:示例(来自记忆)

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