当前位置:  开发笔记 > 运维 > 正文

三角函数的效率/速度

如何解决《三角函数的效率/速度》经验,为你挑选了4个好方法。

在我正在制作的游戏中,我有两个点,pt1和pt2,我想弄清楚它们之间的角度.在早先的计算中,我已经计算出了距离.显而易见的方法是在垂直距离(tan(theta)= opp/adj)上确定水平距离.

我想知道,因为我已经计算了距离,使用arcsine/arccosine与距离和dx或dy会更快吗?

另外,我可能会更好地预先计​​算表格吗?



1> Ethan..:

除了关于过早优化的所有明智评论之外,让我们假设这是热点并做一个frigg'n 基准测试:

酒吧炭

时间以纳秒为单位,按比例缩放以规范系统之间的"acos".
'acos'简单地假定单位半径即acos(adj),而'acos + div'表示acos(adj/hyp).

系统1是运行Mac OS X 10.6.4的2.4GHz i5(gcc 4.2.1)
系统2是运行Red Hat 7的2.83GHz Core2 Quad Linux 2.6.28(gcc 4.1.2)
系统3是1.66GHz Atom N280运行Ubuntu 10.04 2.6.32(GCC 4.4.3)
系统4是2.40GHz的奔腾4运行Ubuntu 10.04 2.6.32(GCC 4.4.3)

摘要:相对性能遍布地图.有时atan2更快,有时慢.非常奇怪的是,在某些系统中,使用除法执行acos比不使用除法更快.在您自己的系统上测试: - /



2> simon..:

我怀疑这里存在过早优化的风险.另外,请注意几何体.你的对立/相邻方法是直角三角形的属性,你实际拥有的是什么?

我假设你的点是平面的,所以对于一般情况你有它们隐含地表示两个向量形成原点(称为v1 v2),所以你的角度是

theta = arccos(dot(v1,v2)/(| v1 || v2 |))其中|.| 是矢量长度.

更快(假设需要)将取决于很多事情.你知道矢量长度,还是必须计算它们?你可以多快在你的架构中做一个点积.acos有多快?在某些时候,像表查找(可能是插值)这样的技巧可能有所帮助,但这会花费你的准确性.

这是所有的权衡,但你的问题确实没有一般的答案.

[编辑:添加评论]

我想再次强调,经常玩"x是最快的"是一个带有现代cpus和编译器的杯子游戏.在测量并生成生成的代码之前,您不会知道.如果您在这个级别上真正关心它(希望是一小段代码),那么您可以详细了解您的系统正在做什么.但这是艰苦的.也许桌子很好.但也许你有快速的矢量计算和一个小缓存.它等于"取决于".抱歉,那个.另一方面,如果你还没有达到你真正关心这段代码的程度......你可能根本就不应该在这个级别上考虑它.改正它.使它干净(这意味着抽象和代码).然后担心开销.



3> Chris Ballan..:

如果你打算做这许多次,在表前计算.这种方式的表现会好得多.


在现代CPU上预先计算不一定更快.这很大程度上取决于缓存未命中等.

4> Mike Dunlave..:

这里有很多好的答案.

顺便说一句,如果你使用Math.atan2,你可以得到一个完整的2π角度.

我会这样做,然后把它弄平.如果您不喜欢速度,并且如果示例显示您实际上大部分时间都在该代码中而不是其他地方,请尝试使用表查找替换它.如果你不需要精度接近1度,你可以使用一个非常小的表和插值.

此外,您可能想要记住该功能.为什么要重新计算你最近做过的事情?

补充:如果你使用一个表,它只需要覆盖0-45度的角度(它可以是硬编码的).你可以通过对称来获得其他所有东西.

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有