这是a fun school project我正在努力。我正在使用Three.js制作3D KSpaceDuel克隆,并使用PeerJS来连接玩家并转移游戏状态。以下是我现在所掌握的基本概念:
conn = peer.connect(partner);
conn.on('open', function() {
startGame();
conn.send(game.getState());
});
conn.on('data', function handlePeerData(data) {
game.updatePartnerState(data);
conn.send(game.getState());
});
这告诉每个客户端以尽可能快地处理负载并发回另一个负载的方式来回传递游戏状态。以下是getState
和updatePartnerState
函数:
game: {
getState: function() {
var p = spaceship.mesh.position,
v = spaceship.velocity,
r = spaceship.mesh.rotation;
return {
position: {x: p.x, y: p.y, z: p.z},
velocity: {x: v.x, y: v.y, z: v.z},
rotation: {x: r.x, y: r.y, z: r.z}
}
},
updatePartnerState: function(state) {
with (state) {
partner.mesh.position.set(position.x, position.y, position.z);
partner.mesh.rotation.set(rotation.x, rotation.y, rotation.z);
partner.velocity.set(velocity.x, velocity.y, velocity.z);
}
}
}
这可能不会让你们中的一些人感到惊讶,但这会让你每隔5秒左右就会出现不稳定的动画和动画打嗝 - 我认为这是垃圾收集者不得不开始的。
如何有效地转移游戏状态? JSON(de)序列化在这里相对昂贵吗?如果是这样,那么我可以转移所有这些数字的聪明,便宜的方式是什么?如果我尽可能地避免使用对象,那么对垃圾收集器施加的压力会减少吗?