これは私が取り組んでいる楽しい学校プロジェクトです。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 (デ) シリアル化は比較的高価ですか? もしそうなら、それらすべての番号を転送するための賢明で安価な方法は何ですか? オブジェクトを可能な限り完全に回避すると、ガベージ コレクターへの負担が軽減されますか?