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
相关产品推荐
相关产品推荐

