我遇到了一个奇怪的问题,我担心它实际上是一个浏览器问题。
我正在开发一个websocket多人游戏。游戏循环在requestAnimationFrame
上运行,位置/游戏数据通过Websockets接收。
我的问题是,无论何时按住鼠标左键并移动鼠标,都会发生导致其他事件停止的事情(例如没有喘息的空间来执行它们)当mouse1被释放时“或”你停止移动鼠标,所有被阻止的事件开火。动画循环不受影响,并按原样运行。
但是我的socket.onmessage
事件停止了,并且没有更新任何职位等(使其看起来像服务器滞后)。
我试图解除所有鼠标事件的绑定,问题是一样的。
我还尝试将stopPropagation()
,preventDefault()
和return false
添加到所有document
鼠标事件中,但问题仍然存在。
我已经记录了时间表来检查阻止它的东西,但什么都没有。除了延迟事件的堆叠。
时间轴基本上是两个重复的功能。
requestAnimationFrame
socket.onmessage
事件正常:
勾选,勾选,勾选,勾选,勾选,数据,勾选,勾选,勾选,勾选,数据 ....等等..
鼠标左键+鼠标移动:
勾选,勾选,勾选,勾选,勾选,勾选,勾选,勾选,勾选, * Mouse1已发布* ,数据,数据,数据,数据
注意:这只发生在鼠标左键,所以我可以使用右键进行拍摄等,问题就不存在了。但这将是一个糟糕的解决方案,因为每个人都会期望它是mouse1,并且当他们持有mouse1时游戏仍然会滞后,即使它没有任何功能。
我发现以下线程存在类似问题,但没有一个解决方案实际有效。
JavaScript Canvas Left-Mouse-Down & Move Lag
Html Canvas lag when Left Mouse is down and moving on Chrome
Mouse down and moving drops chrome canvas to 30FPS using CreateJS
CodePen example 重现此问题。
客户端需要施加压力,因此您需要打开内置的“控制台”(它正在进行一些繁重的日志记录以推送客户端)。 你需要一台120hz +显示器来激发效果。
我知道它看起来很愚蠢,但如果你有一台旧电脑并且无法在你的60hz显示器上运行60fps,你会遇到同样的问题。这纯粹是为了引发这个问题。即使客户端丢弃了fps,游戏也需要运行。
YouTube video 展示了这个问题。