我正在做一个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]);
}
})
答案 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更新来增强它的功能。那真的行不通。您需要使用户体验的更新速度要慢得多。