【问题标题】:Is there a faster alternative to cosine/sine function? [closed]余弦/正弦函数是否有更快的替代方案? [关闭]
【发布时间】:2021-10-21 12:22:44
【问题描述】:

我真的在为 javascript 正弦和余弦函数的效率低下而苦苦挣扎。我正在用 p5.js webgl 制作第一人称射击游戏,它确实造成了大量的延迟。

谁能告诉我如何找到一个角度的正弦/余弦只有一个角? 或者至少告诉我一个更有效的方法来做到这一点?

实际上,我正在尝试重新创建 Math.cosMath.sin 函数,以使其运行更快。

【问题讨论】:

  • 如果你能展示你如何使用它会有所帮助吗?您如何测试这些功能是否会导致延迟?
  • 我正在使用正弦和余弦函数来使子弹和粒子等实体移动。我只需要弄清楚如何在只给定一个角度的情况下更有效地求解角度的正弦和余弦。
  • 没有。将度数转换为弧度并不是我想要的。我正在尝试一种更快的方法来计算角度的正弦和余弦。
  • 我要冒昧地向你保证,正弦和余弦函数不太可能成为你的瓶颈!回复So literally I'm trying to recreate the Math.cos and Math.sin functions to just simply run faster.
  • 我想我会再次重复我的要求,如果您将所有对 sincos 的调用替换为 angle % 1 之类的东西,它是否会滞后(是的,我是认真的 - 只是为了将值保持在与 sin/cos 相同的范围内)。忽略它不再做你想做的事,它仍然滞后吗?如果是这样,您将不会像@Jamiec 建议的那样获得改进的性能。

标签: javascript performance trigonometry


【解决方案1】:

如果您的度数只是 0-359 范围内的完整整数度数,您可以将 sin/cos 的结果缓存在一个数组中,其中度数是数组的索引:

const pi180 = (Math.PI/180);
const angles =[...new Array(360).fill(0)].map((_,i) => ({
  cos: Math.cos(i * pi180),
  sin: Math.sin(i * pi180)
}));
console.log(angles);

如果你想要例如 32 度的 cos,那就是 angles[32].cos

使用弧度更难做到这一点,因为您正在处理浮点值,并且您需要一种截断或插值值之间的方法。


关于您认为cos/sine 是您的瓶颈的简短评论:这不太可能。更有可能的是,您在不必要的时候不断地调用数学函数。检查你的代码,确保你只在它们发生变化时才计算它们,而不是在动画的每个关键帧上计算,并且你只使实际发生变化的部分代码无效。

【讨论】:

猜你喜欢
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多