我用updat里的dt来做50ms的定时器,打印出来的时间在58~68直接徘徊,相差了10多啊,请问有没有办法将这个定时器精确到误差5ms内呢?
你试试setTimeout吧
谢谢大佬,我去试试
update 里的 dt 不是个定值,最短大概是0.0167s,也就是16.7ms, 数值太大,无法做到50ms定时器
你好,是没办法精确的,具体误差是多少,这个没法控制
那请问这种情况有其他办法处理吗?
那没有其他办法处理这个了吗?
定时器应该都是按帧来,而帧率最高也不能设置超过60。
在不出现卡顿的情况下,理论上平均每帧在16.66左右,上下误差为16.66 / 2 = 8.33。
就是说极其流畅的情况下,也可能出现最高8.33ms误差,更不要说出现相对时间较长的卡顿了。
所以关键是在于你需要用到这种计时器是用来具体解决怎样一个问题,然后再考虑在这个基础上去怎么做。
你从其他方面想办法吧,精确是精确不了的
50毫秒一次
var lastUpdateTime = Date.now();
var elapsedTime = 0;
var updateFrequency = 50; //ms
setInterval(() => {
let currentTime = Date.now();
let deltaTime = currentTime - lastUpdateTime;
elapsedTime += deltaTime;
if(elapsedTime >= updateFrequency){
elapsedTime -= updateFrequency;
lastUpdateTime = currentTime;
fixedUpdate();
}
});
function fixedUpdate(){
}
没啥办法。FPS大点,就误差小点
不是有定时器吗schedule
兄弟,不存在精确定时器的,别挣扎了
那也会受到帧率影响,不存在精确定时器
我现在是在做帧同步,每60ms从服务器发送一次数据过来,客户端每60ms从本地缓存池拿数据,我就发现服务器是准时的,但是客户端反而不是那么准时,现在导致了明明是相同的频率拿数据,结果服务器的帧慢慢的在客户端进行了累积,导致客户端执行的越来越滞后,如果我用加速的方法来做的话感觉怪怪的。
还以为你说用update做的定时器,也应该是像楼上给出的代码那样,至少不会累积滞后。
其实应该可以不用做本地定时器,而是直接根据收到的数据,在update中根据具体需求去不断地判断收到的数据。就不用考虑两边计算时间的可能产生的差异。
比如说本地从缓存池拿数据,缓存数据数量是3个,那么只要在update判断,缓存的数据是否为3个,是的话,就拿出之前的一个数据。
或者是客户端每次收到数据的时候,就记录一个时间,也在update中不断去判断这些时间,只要超过某个值就拿取数据。
我现在就是在update里面去不停的判断,时间累积是不是大于了60ms,如果是就拿数据,如果不是就跳出,因为网络会有一些波动,有时候会同时收到3帧,或者多帧,我不能拿到数据就直接处理,所以就是放在缓存池后一个一个固定时间来处理,但是我就是发现update出来的执行时间,有时候是65ms ,有时候是70ms才执行,不是到了60ms就立即执行,这就导致处理比服务器发送的60ms慢了1-10ms,导致执行每6帧,就会比服务器慢一帧,这样一直下去后就越来越慢。
把慢了多少的时间就记录下来,下一次判断的时间上减去这个时间,楼上给的代码就相对于这种作用。
所以你应该还是没完全看明白楼上给的代码。
这样可不可以:
服务端网客户端发同步包的时候,在每个packet里面加一个时间戳,客户端update不准,时间总是准的吧,然后在update里面根据时间戳去处理收集到的packet
你试试游戏多少帧,服务器就每秒发多少次,然后客户端收到就立刻执行