WebSocket 消息每隔几秒就会断断续续
Posted
技术标签:
【中文标题】WebSocket 消息每隔几秒就会断断续续【英文标题】:WebSocket messages stuttering every couple seconds 【发布时间】:2021-10-15 18:06:39 【问题描述】:我正在尝试构建一个使用 WebSockets 的游戏。碰撞检测和游戏状态在服务器上处理,大约每 16 毫秒运行一个游戏循环。每次迭代,它都会向所有玩家发送一条更新状态的消息,从而更新本地副本并渲染游戏。
大约一半的消息可以正常到达,但有时会有数百毫秒的游戏时间立即到达的批次。
我创建了一个最小的测试用例,它每 16 毫秒发送一次当前时间戳。在客户端,你可以看到它每隔几秒缓冲一次消息:
我已经分析了应用程序,在该 gif 的持续时间内只有一个丢帧,否则它保持一致的 60fps。
我猜 GC 可能是其中一个延迟的原因,但至于其他和解决这个问题,我很卡住。
应用本身是 Vue,但是游戏部分是用纯 JS + Canvas 实现的。
【问题讨论】:
【参考方案1】:您的游戏循环是否使用 Window.requestAnimationFrame()?我会尝试单独运行 websocket 代码,就像在计时器中一样。
您还可以尝试 websocket 刷新的其他值,例如 36 毫秒、60 毫秒、120 毫秒,看看这个问题是否仍然存在。可能是浏览器或服务器端的请求过多和一些缓存正在进行。
我无法重现您的问题,您应该确保这是因为 GC。 (如果是这种情况,您可以尝试消除繁重的 GC 调用(尝试重用对象/数组)。或者您可以以某种方式在 Web Worker 中使用您的 websocket 代码,但是如果 GC 运行,则主线程被阻塞,因此您可以将逻辑也放入网络工作者中,但这只是一个疯狂的猜测,无论如何你可以在没有游戏逻辑的网络工作者中测试通信,只是时间戳值)。
【讨论】:
以上是关于WebSocket 消息每隔几秒就会断断续续的主要内容,如果未能解决你的问题,请参考以下文章