javascript - Socket.io 在几秒后停止工作,许多 .emit()?

标签 javascript node.js socket.io

我正在制作一个 2d 游戏,其中连接的人在 map 上行走,所以我需要快速更新人们的位置。 每 17 毫秒(17 因为是 60 fps (1000/60))我发送一个多维数组,其中包含 map 上的所有字符。 问题是,在 1 人连接到服务器几秒钟后,它(服务器)只是停止发送我编程的 console.log 并且什么都不做,没有警告出现并且如果您尝试直接访问它也没有响应通过互联网。 它遭受的是重载吗?我试图将延迟增加到 500 毫秒,即便如此,当 2 人进入时它已经崩溃了。 如果这真的是一项开销,我需要做些什么才能让我的游戏正常运行?

观察: Angular 色的移动系统,客户端要求服务器根据箭头的方向改变 Angular 色在数组中的位置。

代码:

服务器.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]);
    }
}

客户端.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

最佳答案

一个问题是你有这段代码:

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

内部:

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

这意味着您将开始一个新的间隔,每次第一个用户连接时,每 17 毫秒向所有 jogadores 广播一次。我知道您正在尝试仅对第一个用户执行此操作进行测试,但如果您去 1 个用户、0 个用户、1 个用户、0 个用户,那么您将多次启动此间隔。

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

那么,17 毫秒 (60fps) 对于互联网上有大量客户端的真实场景来说可能太快了。工作的速度取决于您的服务器配置、您的 ISP 以及您希望一台服务器支持多少个客户端,您最终必须通过在实际硬件上进行大规模测试来了解您的限制。实时客户端-服务器多用户游戏并非易事。实时多用户游戏系统使用许多技巧来防止延迟并及时更新。详细了解可以完成的所有事情超出了此处的答案范围。但是,只要说您不只是通过尝试向客户端发送 60fps 更新来插入您的方式就够了。那真的行不通。您需要让您的用户体验以更慢的更新速度运行。

关于javascript - Socket.io 在几秒后停止工作,许多 .emit()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53134986/

相关文章:

javascript - 如何在 JavaScript 中设置目标文件夹

javascript - Socket.io 不从客户端向服务器发送数据

javascript - Yii Cgridview $.fn.yiiGridView.getSelection 函数不能立即工作

php - 镜像网站时仅复制更改的文件

java - 使用 JavaScript 更改获取数据的 HTML 标签?

node.js - 通过多种条件获取资源的最佳实践是什么?

javascript - 在javascript中实现递归

node.js - 将 meteor 与 CoffeeScript 和 Jade 一起使用 : callback[i]. 调用不是函数

javascript - 在 Node.js 服务器和浏览器之间共享二进制缓冲区

node.js - Socket.io 是否可以与 Heroku 一起使用?