#4765·bullet3

在 vs2026 UCRT 浮点数更改后,在 Windows (msvc) 上使用 /fp:fast 无法正常工作

作者: brwhale创建于 2025年11月26日更新于 2026年4月8日

因此,微软修改了一大堆浮点代码,以消除错误并提高精度(https://learn.microsoft.com/en-us/cpp/porting/floating-point-migration-issues?view=msvc-170),而此次更新会在使用/fp:fast 时破坏 Bullet(具体来说,它破坏了 BulletDynamics 约束求解器)。通过修改我的项目,我能够将问题缩小到约束求解器上 - 具体来说,问题(荒谬高的碰撞力量爆炸)发生在你有闭合的约束/碰撞循环(例如:坦克的轮子,一个角色双手持物品,两个角色同时使用攻击击中对方)或有一个足够长的约束链(例如绳子)。我猜问题的核心是使用 SSE 指令的某些组合,这些指令用于返回确切的 0 或小于 1.0,而现在由于新的数学,它不完全为 0,或者乘以一个现在大于 1 而不是小于 1 的标量?我还没有找到确切的问题,但我确实发现将 /fp 标志更改为 /fp:precise、/fp:strict 或 /fp:default 可以解决问题,但不幸的是,我会失去一些优化。

内容来源: bulletphysics/bullet3