这是我正在做的一个有趣的学校项目。我正在使用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(反)序列化在这里相对昂贵吗?如果是这样,我可以转移所有这些号码的更聪明、更便宜的方式是什么?如果我尽可能地完全避免对象,那会给垃圾收集器带来更少的压力吗?