我使用以下代码:

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。
为什么?

最佳答案

执行此操作时:

XMVector3Rotate(rays[i], orientation);


我猜编译器会内联函数-并且看到它,因为它的结果永远不会在任何地方赋值-实际上它什么也没做,并且完全删除了函数调用。这是非常快的,因为它实际上没有做任何事情。

但是,当您添加作业时:

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


突然之间,您正在进行大量的内存读取和写入以及各种数学运算-所有这些以前都被跳过了。

(您已经标记了此XNA,但这是C ++函数。大多数C ++编译器可以并且将内联这样的函数。标准C#编译器不能。)

07-24 22:29