【问题标题】:Fully replicable Javascript Physic 2D engine for netplay用于网络游戏的完全可复制的 Javascript 物理 2D 引擎
【发布时间】:2016-12-28 21:54:03
【问题描述】:

是否有任何完全可复制的 Javascript Physic 2D 引擎,因此我们可以将模拟状态保存为例如字节数组,并将其加载到另一台机器(相同架构)中,这样两个模拟将执行相同的后续步骤?

我已经听说,Box2D 有一些(缓存?)数据,我们无法将其与身体/力/关节等一起存储。

【问题讨论】:

    标签: javascript box2d physics game-physics


    【解决方案1】:

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

    对于实时多人游戏,如果状态(位置、旋转、速度)与服务器状态相差太大,您通常会运行本地物理模拟并对其进行修正。虚幻引擎使用这种方法,更多信息请访问https://docs.unrealengine.com/udk/Three/NetworkingOverview.html#Physics

    只需要物理场景的初始状态来执行动画的游戏(例如回合制游戏),也不需要完整的物理引擎状态。如果您以确定性方式使用物理引擎,则为deterministic。要在两个客户端上以相同的方式重新播放物理动画,请记住:

    • 在开始模拟之前重置(重新创建)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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 2011-07-05
      • 1970-01-01
      • 2020-01-17
      • 1970-01-01
      • 1970-01-01
      • 2012-04-27
      相关资源
      最近更新 更多