首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >函数后向量赋值的性能

函数后向量赋值的性能
EN

Stack Overflow用户
提问于 2011-05-10 22:58:48
回答 3查看 381关注 0票数 0

我使用以下代码:

代码语言:javascript
运行
复制
MainLoop() {
    for (int i = 0; i < length; i++) {
        XMVector3Rotate(rays[i], orientation);
    }
}

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

代码语言:javascript
运行
复制
MainLoop() {
    for (int i = 0; i < length; i++) {
        calculatedRays[i] = XMVector3Rotate(rays[i], orientation);
    }
}

我的fps = 200。为什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-10 23:25:31

当你这样做的时候:

代码语言:javascript
运行
复制
XMVector3Rotate(rays[i], orientation);

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

但是当你添加赋值的时候:

代码语言:javascript
运行
复制
calculatedRays[i] = XMVector3Rotate(rays[i], orientation);

突然之间,你正在做一堆内存读写和各种数学运算--所有这些以前都被跳过了。

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

票数 7
EN

Stack Overflow用户

发布于 2011-05-10 23:25:28

在第一个示例中,函数的结果立即被丢弃(未被赋值)。编译器足够聪明,能够感知到这一点,并省略了方法调用...

票数 2
EN

Stack Overflow用户

发布于 2011-05-10 23:19:00

假设XMVector3Rotate返回XNA Vector3类型,这将是一个结构复制操作,性能相对较高。

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

编辑:示例(从内存)

代码语言:javascript
运行
复制
Vector3 vec1 = something, vec2 = something, result;
Vector3.Add(ref vec1, ref vec2, out result);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5952103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档