netplay的完全可复制Javascript Physic 2D引擎

netplay的完全可复制Javascript Physic 2D引擎,javascript,box2d,physics,game-physics,Javascript,Box2d,Physics,Game Physics,是否有任何完全可复制的Javascript Physic 2D引擎,以便我们可以将模拟状态保存为一个字节数组,并将其加载到另一台机器上,使其具有相同的体系结构,以便两个模拟将执行相同的下一步 我已经听说Box2D有缓存吗?我们不能将数据与身体/力/关节等一起存储。根据我的经验,物理引擎状态的完全复制是困难的,而且是不必要的 对于实时多人游戏,通常运行本地物理模拟,如果状态位置、旋转、速度与服务器状态相差过大,则对其进行更正。虚幻引擎使用这种方法,请阅读 仅需要物理场景的初始状态来执行动画的游戏(

是否有任何完全可复制的Javascript Physic 2D引擎,以便我们可以将模拟状态保存为一个字节数组,并将其加载到另一台机器上,使其具有相同的体系结构,以便两个模拟将执行相同的下一步


我已经听说Box2D有缓存吗?我们不能将数据与身体/力/关节等一起存储。

根据我的经验,物理引擎状态的完全复制是困难的,而且是不必要的

对于实时多人游戏,通常运行本地物理模拟,如果状态位置、旋转、速度与服务器状态相差过大,则对其进行更正。虚幻引擎使用这种方法,请阅读

仅需要物理场景的初始状态来执行动画的游戏(如基于回合的游戏)也不需要完整的物理引擎状态。如果你以确定性的方式使用物理引擎,那么它就是。要在两个客户端上以相同的方式重新播放物理动画,请记住:

重置在开始模拟之前重新创建b2World,以消除b2World中的任何内部状态。 建立你的物理世界,在初始位置创建物体,等等。 向前推进模拟,在所有客户端上使用相同的固定时间步长。不要使用渲染帧增量时间,因为它在所有客户端上都不相同!。 例如,如果在模拟过程中需要与实体交互,请应用一个力,然后在相同的步数上执行此操作非常重要。 例如,如果所有客户端都获得相同的InitialPhysicsState,则以下函数每次都将在所有客户端上返回相同的结果:

float deterministicFunction( InitialPhysicsState state ){
    b2World* world = createWorld(state);
    b2Body* body = world->GetBodyList();
    for(int i=0; i<100; i++){
        if(i==50){
            body->ApplyForce(b2Vec2(10.0f, 2.0f));
        }
        world->Step(0.01f, 8, 3);
    }
    return body->GetPosition().y;
}