我在做一个2D游戏,连人走的地图,所以我需要的人们将是一个快速更新。
每17毫秒(17因为是60fps(1000至1060年))我发送多维数组,其中所有地图上的字符是。
问题是,几秒钟后1个人连接到服务器,它(服务器)简单地停止发送的console.log,我编程,没有别的,没有出现警告,如果你尝试直接访问它不响应通过互联网。
它是一个重载遭罪?我试图将延迟增加到500毫秒,即使这样,当2个人进入时,它已经崩溃了。
如果确实是开销,那么我该怎么做才能使游戏正常运行?

观察:字符的举动系统,客户要求服务器根据箭头的方向来改变所述阵列中的字符的位置。

码:

Server.js:

let jogadoresSala = [[]];
io.on('connection', socket=>{
//codigo que é executado quando uma pessoa conecta
    socketIds.push(socket.id);
    pessoasConectadas++;
    console.log("nova conexão : " + socket.id);
    socket.emit('voceEstaConectado', pessoasConectadas);
    socket.join('jogadores');
    if(pessoasConectadas == 1){
        jogadoresSala[0] = [Math.floor(Math.random() * 300),
        Math.floor(Math.random() * 300), socket.id];
        setInterval(function () {
            console.log('sending..');
            io.in('jogadores').emit('sincronizacao', jogadoresSala);
        }, 17); //where is the loop
    } else {
        jogadoresSala.push([Math.floor(Math.random() * 300),
        Math.floor(Math.random() * 300), socket.id]);
    }
}


cliente.js
(工作几秒钟,如果客户不动,它可以在几分钟之内到达);

socket.on('sincronizacao', posicoesPersonagens => {
    console.log(posicoesPersonagens);
    var key = [];
    for (let i = 0; i < posicoesPersonagens.length; i++) {
        personagem.setarPosicao(posicoesPersonagens[i][0], posicoesPersonagens[i][1]);
    }
})


游戏图片:
javascript - Socket.io在几秒钟后停止工作,很多.emit()吗?-LMLPHP

最佳答案

一个问题是您有以下代码:

    setInterval(function () {
        console.log('sending..');
        io.in('jogadores').emit('sincronizacao', jogadoresSala);
    }, 17); //where is the loop


代替:

io.on('connection', ...)


这意味着您将开始一个新的时间间隔,该时间间隔将在第一个用户每次连接时每17ms向所有jogador广播一次。我知道你想测试仅在第一个用户这样做,但如果你去1个用户,0用户,用户1,用户0,那么您就可以开始这个时间间隔多次。

因此,对于初学者来说,您需要将setInterval()移到io.on('connection', ...)回调之外。服务器启动后,只需将其放在顶层即可。如果没有连接的客户端,那么它不会有任何瓜葛,因为会在jogadores房间里没有连接,所以没有问题。

然后,对于具有许多客户的Internet上的现实世界场景,17ms(60fps)可能太快了。什么样的速度将努力将取决于您的服务器配置,您的ISP和多少客户,你希望与一个服务器的支持,你将最终有大规模您的实际硬件测试,了解自己的极限。实时客户端-服务器多用户游戏并不是一件容易的事。实时多用户游戏系统使用许多技巧来尝试防止延迟并及时更新。详细介绍所有可以完成的事情超出了此处的答案范围。但是,可以说您不只是通过尝试向客户端发送60fps更新来增强它的功能。那真的行不通。您将需要使用户体验的更新速度要慢得多。

09-25 19:59