如何以指定的帧速绘制动画?用setInterval来调度误差大吗?下面的测试会给出解答。
浏览器
测试15fps的帧速(帧间隔毫秒为1000/15),测试持续60秒,期间页面一直保持显示状态(不切换到后台,不息屏)
Test setInterval with 1000/60~=66.6667 delay, 60s duration, page kept visible all the time (without switching to background, without screen off)
在线演示见CodePen setInterval actual interval test
Interval set: 0
Average interval 0
Actual average interval of setInterval
| occasion \ platform | Windows Chrome | Android Chrome | macOS Safari | iOS Safari | Windows Firefox | Android Firefox |
|---|---|---|---|---|---|---|
| page visible | 66.01 | 66.01 | 66.69 | 78.45 | 66.67 | |
| page visible (battery power saving mode) | 66.01 | 66.01 | 89.76 | 78.36 | 66.68 | |
| page hidden | ||||||
| page hidden (battery power saving mode) |
Chrome的setInterval似乎对delay参数进行了floor()处理(不支持delay的小数部分),采取自校准策略使得调度较为准时(当参数delay为整数时调度不会顺延),似乎未针对省电模式切换策略。
Safari的setInterval分两种情况:非省电模式中支持delay参数的小数部分,采取自校准策略使得调度较为准时;省电模式中采取累积延迟策略(顺延)。
Windows Firefox的setInterval采取累积延迟策略,Android Firefox的setInterval采取自校准策略,两者似乎未针对省电模式切换策略。