gpt4 book ai didi

c++ - Box2D 不寻常的错误。为什么 +0 可以防止错误?

转载 作者:行者123 更新时间:2023-11-30 05:16:18 25 4
gpt4 key购买 nike

我发现了一个我不明白的非常奇怪的错误。也许有人可以阐明一些道理。

问题

我正在使用 box2D 运行物理模拟。模拟中的一件事是每帧都将其线性阻尼设置为 0 到 2 之间的 float 的物体。在每个物体上,调用以下行。

body->SetLinearDamping(value);

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

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

编辑:我应该提一下,在调用 b2World::Step 一定次数后,内存的增加就开始了。大概是一万左右吧。我不知道如何从程序内部检测问题,所以我无法确定每次的步骤数是否相同。

错误

最初我以为我可能以某种方式滥用了 SetLinearDamping。我试图改变值的范围,所以我简单地给它们加了+1。这实际上完全解决了问题,我通过添加大约 10,000 个对象并将它们四处移动来对其进行压力测试。

所以接下来我将这个值变小,试图确定我可以添加的最小值。 +0.01f 和 +1 一样有效,所以在执行 + numeric_limits::min() 之前我尝试了 +0。所以现在我的代码是:

body->SetLinearDamping(value+0);

这修复了程序。发现这一点后,我实际上对程序进行了更多开发,并且运行完全稳定。我原以为编译器会优化它。这实际上在 C++ 中有任何功能吗?这如何防止 box2d 中出现问题?

最佳答案

在花费大量时间单步执行代码后,我确定了原因和解决方案。对于在 box2d 中遇到类似问题的任何人,您需要检查 NaN。我什至忘记了 C++ 甚至有这些,我必须说,我觉得自己像个白痴,这超出了我的头脑。

这里的问题是,偶尔,提供值的函数会返回 nan。将 nan 作为线速度传递给 box2d 函数会导致 nans 在我的程序中波动,你知道 nans 是怎样的。

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

最后,将 0 添加到 NaN 显然会返回 0。因此,在回答最初的问题时,value 与 value+0 之间的功能差异是什么:

在值不是数字的情况下,值的计算结果为 0。

关于c++ - Box2D 不寻常的错误。为什么 +0 可以防止错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42723678/

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