Box2D不寻常的bug。为什么+0会阻止错误?

时间:2017-03-10 16:52:55

标签: c++ box2d

我发现了一个非常奇怪的错误,我不明白。也许有人可以说清楚。

问题

我使用box2D来运行物理模拟。模拟中的一个方面是一个主体,它的每一帧都有线性阻尼,在0到2之间浮动。在每个主体上,调用以下行。

body->SetLinearDamping(value);

当添加足够的这些物体(大约500个)时,程序会悄然破坏(不知何故),并且内存使用量会在几秒钟内从约50mb上升到300mb。在同一点上,只有1或2个物体被渲染,只有几秒钟。这可能是因为world.query返回不正确的结果。

我确实设法确定程序死亡记忆峰值的原因。在box2d的求解功能中,联系人管理器增加了数千对。多余的内存几乎全部来自b2Contact :: Create。

编辑:我应该提到,在对b2World :: Step进行一定数量的调用之后,自我开始增加。它可能大约有10,000左右。我不知道如何从程序中检测问题,所以我无法确定每次步数是否相同。

The Bug

最初我以为我可能会以某种方式误用SetLinearDamping。我试图更改值的范围,所以我只是添加+1。这实际上完全解决了这个问题,我通过添加大约10,000个对象并推动它们来进行压力测试。

接下来我把这个值缩小了,试图确定我可以添加的最小值。 + 0.01f和+1一样工作,所以在做+ numeric_limits :: min()之前我试过+0。所以现在我的代码是:

body->SetLinearDamping(value+0);

这修复了该程序。在发现这个之后,我实际上已经开发了更多程序,并且它运行完全稳定。我原以为编译器会优化它。这实际上在c ++中是否有任何功能?如何防止box2d中出现问题?

1 个答案:

答案 0 :(得分:1)

花了很长时间踩过代码,我已经确定了原因和解决方案。对于在box2d中遇到类似问题的任何人,您需要检查NaN' s。我忘记了c ++,即使有这些,我必须说我觉得这是一个白痴,这是我的头脑。

这里的问题是,偶尔提供该值的函数将返回nan。将nan作为线性速度传递给box2d函数会在我的程序中产生nans的波纹,你知道nans是多少。

在我的身体的所有x和y值最终为nan之后,它们基本上都在同一个地方。这导致碰撞管理器必须生成数千对,因为必须针对每个其他碰撞体检查每个碰撞体。

最后,向NaN添加0显然会返回0.因此,在回答原始问题时,值与值+ 0 之间的功能差异是什么:

在值为非数字的情况下,值的计算结果为0.