gpt4 book ai didi

performance - 有没有更快的方法来绕圈移动东西?

转载 作者:行者123 更新时间:2023-12-04 02:39:10 25 4
gpt4 key购买 nike

目前我正在使用 Math.cos 和 Math.sin 在我的游戏中移动物体,但我怀疑它在阅读了一些相关内容后速度很慢(虽然还没有进行适当的测试)。

有什么方法可以更快地计算出来吗?一直在阅读,一种替代方法可能是拥有一种存储预先计算结果的哈希表,就像计算机时代之前的老人们在过去使用它一样。

欢迎任何意见。

最佳答案

扩展我的评论,如果你没有任何角加速度(角速度保持恒定——这是物体在不改变中心指向力的情况下保持在恒定半径的圆中行进的要求,例如通过字符串中的张力),那么你可以使用以下策略:

1) 计算 B = angular_velocity * time_step_size。这是物体在单个时间步长内需要经历的角度变化量。

2) 计算sinb = sin(B)cosb = cos(B)

3)请注意,我们要将角度从 A 更改为 A+B(对象逆时针方向)。在这个推导中,我们绕行的圆的中心由原点给出。由于圆的半径是常数,我们知道 r*sin(A+B) = y_new = r*sin(A)cos(B) + r*cos(A)sin(B) = y_old * cos (B) + x_old*sin(B)r*cos(A+B) = x_new = r*cos(A)*cos(B) - r*sin(A)sin(B ) = x_old*cos(B) - y_old*sin(B)

我们已经删除了我们不知道的任何东西的余弦和正弦,所以笛卡尔坐标可以写成

x_new = x_old*cosb - y_old*sinb

y_new = x_old*sinb + y_old*cosb

除了调用一次的初始化步骤外,不再调用 cos 或 sin。显然,如果 B 由于任何原因(角速度或时间步长变化)不断变化,这不会为您节省任何东西。

您会注意到这与将位置向量乘以固定旋转矩阵相同。如果您不想只考虑圆心在原点的圆,您可以按圆心平移并向后平移。

第一次编辑

正如@user5428643 提到的,由于半径漂移,这种方法随着时间的推移在数值上不稳定。您可以通过定期重新规范化 x 和 y (x_new = x_old * r_const/sqrt(x_old^2 + y_old^2) 并且类似地每隔几千步对 y 进行重新规范化来纠正此问题——如果您实现此操作,保存因子 r_const/sqrt(x_old^2 + y_old^2) 因为它对于 xy 是相同的)。如果我想出更好的解决方案,我会再考虑一下并编辑此答案。

第二次编辑

关于数值随时间漂移的更多评论:

我用 C++ 和 Python 做了几个测试。在使用单精度 float 的 C++ 中,当 B = 0.1 时,即使在 100 万个时间步之后也存在相当大的漂移。我使用了一个半径为 1 的圆。在 double 中,我在 1 亿步后没有在视觉上注意到任何漂移,但检查半径显示它在较低的几位数字中被污染。对 步进行重新归一化(如果您只是进行可视化,这是不必要的)导致运行时间比漂移版本慢大约 4 倍。然而,即使是这个版本也比在每次迭代中使用 sin 和 cos 快 2-3 倍。我在 g++ 中使用了完全优化 (-O3)。在 python 中(使用数学包)我在漂移版本和规范化版本之间只得到了 2 的加速,但是 sin 和 cos 版本实际上介于这两者之间——就运行时间而言,它几乎恰好介于这两者之间。每隔几千步重新归一化一次仍然可以使速度更快,但它并没有我的 C++ 版本所显示的那么大。

我没有做太多科学测试来确定时间,只是进行了 100 万到 10 亿步的一些测试,增量为 10。

关于performance - 有没有更快的方法来绕圈移动东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33004242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com