我在做一个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]);
}
})
游戏图片:
最佳答案
一个问题是您有以下代码:
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更新来增强它的功能。那真的行不通。您将需要使用户体验的更新速度要慢得多。