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