我正在制作一个 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]);
}
})
最佳答案
一个问题是你有这段代码:
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/