这是一个简单的公式和例程,适用于 socket.io、php 或其他任何东西。我用它在直播前 10 秒淡入直播视频流。鉴于固有的滞后和设备性能模式以及错误的时区,您只能期望获得大约 30 毫秒的向前或向后精度,但对于大多数观察者来说,这一切都是“同时”发生的。
这是一个比模拟客户端(你)晚两分钟的服务器的模拟,服务器希望客户端在 1.2 秒内显示一个弹出窗口:
//the first two vars should come from the server:
var serverWant=+new Date() - 123456 + 1200; // what server time is the event ?
var serverTime=+new Date() - 123456; // what server time is now ?
//the rest happens in your normal event using available info:
var clientTime=+new Date(); // what client time is now ?
var off= clientTime - serverTime; // how far off is the client from the server?
var clientWant= serverWant + off; // what client time is the event ?
var waitFor = clientWant - +new Date(); // how many millis to time out for until event ?
setTimeout(function(){ alert( 'SNAP!' );}, waitFor);
这有多可靠?尝试将“- 123456”都更改为“+ 12345”,看看弹出窗口是否仍然等待 1.2 秒才能触发,尽管在计算中没有使用 Math.abs...
在 socket.io 中,您可以将服务器时间和预定时间发送到客户端以在事件前进行计算:
socket.broadcast.emit('pre-init', {
serverTime: +new Date(),
serverWant: +new Date() + 1200
});
然后使用这些值和上面的数学来根据需要在几分钟或几小时内安排动画,按需(你的)到瞬间。