You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js服务器无客户端输入时Tick速率异常降低,有交互时恢复正常的问题求助

Node.js服务器无客户端输入时Tick速率异常降低,有交互时恢复正常的问题求助

各位大佬好,我最近在做一个用JavaScript Canvas + Node.js开发的个人游戏项目,遇到了一个特别诡异的服务器Tick速率问题,折腾了好久都没解决,来这儿求助了!

先说说我的场景:我用Express.js在Windows上搭了个测试服务器,设定的Tick速率是100次/秒,服务器主循环用setTimeout实现,代码如下:

let tickCounter = 0;
let lastPrint = Date.now();
function gameLoop() {
  tickCounter++;
  const now = Date.now();
  if (now - lastPrint >= 1000) {
    console.log(`Ticks per second: ${tickCounter}`);
    lastPrint = now;
    tickCounter = 0;
  }
  setTimeout(gameLoop, TICK_INTERVAL); // TICK_INTERVAL为10ms(1000/100)
}
gameLoop();

按道理服务器应该稳定输出100次/秒的Tick,但实际跑起来只有65次左右,远达不到预期。

但诡异的是,当我运行客户端,并且移动鼠标的时候,服务器的Tick速率居然直接恢复到100次/秒了!客户端的鼠标移动相关代码是这样的:

var mouse = { 
  X: canvas.width / 2, 
  Y: canvas.height / 2, 
}

window.addEventListener('mousemove', e => {
  mouse.X = e.clientX;
  mouse.Y = e.clientY;
  console.log(mouse.X, mouse.Y);
  socket.emit("rotate", { 
    "angle": Math.atan2(mouse.X - canvas.width / 2, mouse.Y - canvas.height / 2) + Math.PI 
  });
});

我已经试过各种方法排查了:

  • 换了不同的Tick速率测试,结果都是一样的:无交互时速率不足,有客户端消息时恢复正常
  • 把setTimeout换成setInterval,问题依旧存在
  • 在任务管理器里把node.exe的进程优先级调高,也没起到效果

目前唯一能让服务器Tick速率稳定的临时方法,就是让客户端持续给服务器发无用数据,但这显然不是长久之计,后期肯定会给服务器带来不必要的负载。

另外补充下:我把代码发给用Linux系统的朋友测试,他那边完全没有这个问题,看来这是Windows环境下Node.js的特有问题?

这个Tick速率的波动给我的游戏项目带来了很多同步上的问题,有没有大佬遇到过类似的情况,或者知道怎么解决吗?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 07:10:30