gpt4 book ai didi

javascript - 减少 Nodejs 游戏的延迟

转载 作者:行者123 更新时间:2023-12-01 02:13:45 25 4
gpt4 key购买 nike

我创建了一个nodejs游戏。我在服务器上有一个 setInterval 函数,它发送玩家附近的所有对象。但它似乎不像我在本地运行时那么顺利。数据包大约有60个对象。这是发送对象并在客户端接收对象的服务器代码。有什么方法可以压缩包或减少滞后吗? pinka.herokuapp.com

服务器:

setInterval(function() {
server.update();

for(var key in sockets) {
var socket = sockets[key];
var player = server.players.filter(function(p) {
return p.id == socket.id
})[0];


var package = [];
var blobs = server.getNodesInRange(player.centerX, player.centerY);

for(var i = 0; i < blobs.length; i++) {
var b = blobs[i];
package.push({
x: b.x,
y: b.y,
nick: b.nick,
size: Math.sqrt(b._mass) * 10,
hue: b.hue
});
};

socket.emit("update blobs", package);
socket.emit("leaders", server.getLeaders());

if(player.blobs.length == 0) {
socket.emit("dead");
continue;
}

var translateX = player._centerX * player._drawZoom - player.screenWidth / 2;
var translateY = player._centerY * player._drawZoom - player.screenHeight / 2;


socket.emit("center and zoom", {
centerX: translateX,
centerY: translateY,
zoom: player._drawZoom
});
}
}, 1000/60);

客户端:

socket.on("update blobs", function(data) {
blobs = data;
});

这就是整个沟通部分。

最佳答案

正如 Jonas W. 所说,问题出在服务器与客户端的通信上。为了提高效率,socket.io 的实时系统应该基于事件而不是间隔检查。

我建议你有这样的东西:

  • 客户端上,当用户移动时发出“user:move”事件。防止发生太多事件,以通过不必要的更新来减轻服务器负担。
  • 服务器上,对特定的“玩家:移动”事件使用react。如果需要将事件广播给其他玩家,则具有实际上可以“看到”操作的过滤器也可以避免客户端获得不必要的信息。

伪代码示例:

客户端

let updating = false;
let timeout = 0;

// Assuming this function is triggered everytime the user moves (i.e. presses a key)
onUserMove (data) {
if ('same press as before' && updating) {
// ignore move if it's the same that has just been done
return;
} else {
socket.emit('user:move', data);

// 'Block' the emit for same movement for 20ms
updating = true;
clearTimeout(timeout);
timeout = setTimeout(() => {
updating = false;
}, 20);
}
}

服务器

socket.on('user:move', (data) => {
const dataForTheUser = processingYouAreAlreadyDoing(data);
socket.emit('data:for:user', dataForTheUser);

// In case there's information to be sent to every user
const dataToBroadcast = getDataToBroadcast(data);
const usersToBroadcast = getCloseUsers(data);

for (let user in usersToBroadcast) {
user.socket.emit('whatever:event', dataToBroadcast);
}
})

关于javascript - 减少 Nodejs 游戏的延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49587736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com