Socket.io在几秒钟后停止工作,很多.emit()吗?

时间:2018-11-03 19:55:55

标签: javascript node.js socket.io

我正在做一个2D游戏,连接的人在地图上行走,所以我需要快速更新人们的位置。 每17毫秒(之所以17是因为是60 fps(1000/60)),我发送了一个多维数组,其中地图上的所有字符都在其中。 问题是,在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]);
    }
})

游戏图片: enter image description here

1 个答案:

答案 0 :(得分:1)

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

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

内部:

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

这意味着您开始一个新的时间间隔,该时间间隔是在第一个用户每次连接时每17ms向所有慢跑者广播一次。我知道您正在尝试测试仅对第一个用户执行此操作,但是如果您选择1个用户,0个用户,1个用户,0个用户,则将多次启动此间隔。

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

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