0

我正在尝试保存和加载 b2World 的状态,以便稍后恢复模拟,但碰撞管理器等的状态得到完全维护。最好的方法是什么(无需进入库内部,并且在监视每个类的公共/私有成员时必须使用 boost 序列化)?有没有办法重新利用 b2World.dump 函数中的日志文件来再次构造对象?

4

1 回答 1

0

我认为按原样解析 Dump 是一个死胡同。首先,输出Dump似乎是可执行的 C++ 代码

        b2ChainShape chainShape;
        b2Vec2 vertices[] = {b2Vec2(-5,0), b2Vec2(5,0), b2Vec2(5,5), b2Vec2(4,1), b2Vec2(-4,1), b2Vec2(-5,5)};
        chainShape.CreateLoop(vertices, 6);

        b2FixtureDef groundFixtureDef;
        groundFixtureDef.density = 0;
        groundFixtureDef.shape = &chainShape;

其次,存在以足够精度转储浮点值以重新创建原始对象的问题。最后,有些对象似乎根本不支持转储。

一些替代方案:

  • 破解 box2d 并添加您自己的状态保持转储机制
  • 将所有 box2d 对象保存在特定内存区域中,并使用内存快照和/或检查点技术在加载时再次恢复该内存。我知道的一个这样的库是Ken,但我确信还有其他实现。
于 2021-07-28T06:54:28.857 回答