Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何通过网络高效地每秒数十次同步游戏状态?_Javascript_Three.js - Fatal编程技术网

Javascript 如何通过网络高效地每秒数十次同步游戏状态?

Javascript 如何通过网络高效地每秒数十次同步游戏状态?,javascript,three.js,Javascript,Three.js,这是我正在做的。我用它来制作一个3D克隆,连接玩家并转移游戏状态。以下是我现在的基本想法: conn = peer.connect(partner); conn.on('open', function() { startGame(); conn.send(game.getState()); }); conn.on('data', function handlePeerData(data) { game.updatePartnerState(data); con

这是我正在做的。我用它来制作一个3D克隆,连接玩家并转移游戏状态。以下是我现在的基本想法:

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(反)序列化在这里相对昂贵吗?如果是这样的话,我可以用什么聪明、便宜的方式来传输这些号码?如果我尽可能避免使用对象,这会不会减少垃圾收集器的压力?

如果你真的认为原因是GC,你应该仔细看看你的客户端代码。也许这有帮助: