完全可复制 Javascript 用于网络游戏的物理 2D 引擎
Fully replicable Javascript Physic 2D engine for netplay
是否有任何完全可复制的Javascript物理2D引擎,所以我们可以将模拟状态保存为字节数组,并将其加载到另一台机器(相同架构)中,以便接下来两个模拟都将执行相同的操作步骤?
我已经听说了,Box2D 有一些(缓存?)我们无法与 bodies/forces/joints 等一起存储的数据
根据我的经验,完全复制物理引擎状态既困难又不必要。
对于实时多人游戏,您通常 运行 本地物理模拟,如果状态(位置、旋转、速度)与服务器状态差异太大,则对其进行修正。 Unreal Engine 使用这种方法,在 https://docs.unrealengine.com/udk/Three/NetworkingOverview.html#Physics
阅读更多
只需要物理场景的初始状态来执行动画的游戏(例如回合制游戏),也不需要完整的物理引擎状态。如果您以确定性方式使用物理引擎,则它们是 deterministic。要在两个客户端上以相同的方式 re-play 一个物理动画,请记住:
- 在开始模拟之前重置 (re-create)
b2World
,以摆脱 b2World
. 中的任何内部状态
- 设置你的物理世界,在初始位置创建物体等
- 向前推进模拟,在所有客户端上使用相同的固定时间步长(不要使用渲染帧增量时间,因为它在所有客户端上都不相同!)。
- 如果您需要在模拟过程中与身体互动(例如,施加力),那么在相同的步数.[=31=上进行很重要]
例如,如果所有客户端都获得相同的 InitialPhysicsState
:
,则以下函数每次在所有客户端上都会 return 相同的结果
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;
}
是否有任何完全可复制的Javascript物理2D引擎,所以我们可以将模拟状态保存为字节数组,并将其加载到另一台机器(相同架构)中,以便接下来两个模拟都将执行相同的操作步骤?
我已经听说了,Box2D 有一些(缓存?)我们无法与 bodies/forces/joints 等一起存储的数据
根据我的经验,完全复制物理引擎状态既困难又不必要。
对于实时多人游戏,您通常 运行 本地物理模拟,如果状态(位置、旋转、速度)与服务器状态差异太大,则对其进行修正。 Unreal Engine 使用这种方法,在 https://docs.unrealengine.com/udk/Three/NetworkingOverview.html#Physics
阅读更多只需要物理场景的初始状态来执行动画的游戏(例如回合制游戏),也不需要完整的物理引擎状态。如果您以确定性方式使用物理引擎,则它们是 deterministic。要在两个客户端上以相同的方式 re-play 一个物理动画,请记住:
- 在开始模拟之前重置 (re-create)
b2World
,以摆脱b2World
. 中的任何内部状态
- 设置你的物理世界,在初始位置创建物体等
- 向前推进模拟,在所有客户端上使用相同的固定时间步长(不要使用渲染帧增量时间,因为它在所有客户端上都不相同!)。
- 如果您需要在模拟过程中与身体互动(例如,施加力),那么在相同的步数.[=31=上进行很重要]
例如,如果所有客户端都获得相同的 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;
}