为什么我在Windows UWP Javascript应用程序中看到requestAnimationFrame()回调之间的间隔不一致?

为什么我在Windows UWP Javascript应用程序中看到requestAnimationFrame()回调之间的间隔不一致?,javascript,uwp,requestanimationframe,Javascript,Uwp,Requestanimationframe,我正在开发一个Windows UWP Javascript游戏项目,希望能够平滑地显示该项目,因此我使用requestAnimationFrame()来处理渲染 但是,我返回的时间间隔并不一致: { document.grabFrame = function(timestamp) { logTimestamp(timestamp); requestAnimationFrame(document.grabFrame, 0); ...do re

我正在开发一个Windows UWP Javascript游戏项目,希望能够平滑地显示该项目,因此我使用requestAnimationFrame()来处理渲染

但是,我返回的时间间隔并不一致:

{
    document.grabFrame = function(timestamp) {
        logTimestamp(timestamp);
        requestAnimationFrame(document.grabFrame, 0);
        ...do rendering...
    }

    requestAnimationFrame(document.grabFrame, 0);
}
FrameStart: 16.30 ms
FrameStart: 16.02 ms
FrameStart: 17.66 ms
FrameStart: 16.17 ms
FrameStart: 15.92 ms
FrameStart: 16.36 ms
FrameStart: 17.26 ms
FrameStart: 16.27 ms
FrameStart: 16.73 ms
FrameStart: 17.53 ms
FrameStart: 16.77 ms
FrameStart: 16.54 ms
FrameStart: 17.68 ms
FrameStart: 15.98 ms
FrameStart: 16.26 ms
FrameStart: 16.10 ms
FrameStart: 16.63 ms
FrameStart: 18.16 ms
FrameStart: 15.98 ms
FrameStart: 16.35 ms
FrameStart: 16.81 ms
FrameStart: 17.17 ms
FrameStart: 18.46 ms
FrameStart: 14.58 ms
FrameStart: 17.08 ms
FrameStart: 17.12 ms
FrameStart: 15.85 ms
FrameStart: 23.19 ms
FrameStart: 14.38 ms
FrameStart: 13.27 ms
FrameStart: 15.73 ms
FrameStart: 15.57 ms
FrameStart: 16.79 ms
FrameStart: 14.64 ms
FrameStart: 18.11 ms
FrameStart: 17.45 ms
FrameStart: 16.11 ms
FrameStart: 18.61 ms
(日志记录使用本机C)

我有一个60 FPS的监视器,预计每次的时间戳值大约为16.66ms。然而,它们之间却极不一致:

{
    document.grabFrame = function(timestamp) {
        logTimestamp(timestamp);
        requestAnimationFrame(document.grabFrame, 0);
        ...do rendering...
    }

    requestAnimationFrame(document.grabFrame, 0);
}
FrameStart: 16.30 ms
FrameStart: 16.02 ms
FrameStart: 17.66 ms
FrameStart: 16.17 ms
FrameStart: 15.92 ms
FrameStart: 16.36 ms
FrameStart: 17.26 ms
FrameStart: 16.27 ms
FrameStart: 16.73 ms
FrameStart: 17.53 ms
FrameStart: 16.77 ms
FrameStart: 16.54 ms
FrameStart: 17.68 ms
FrameStart: 15.98 ms
FrameStart: 16.26 ms
FrameStart: 16.10 ms
FrameStart: 16.63 ms
FrameStart: 18.16 ms
FrameStart: 15.98 ms
FrameStart: 16.35 ms
FrameStart: 16.81 ms
FrameStart: 17.17 ms
FrameStart: 18.46 ms
FrameStart: 14.58 ms
FrameStart: 17.08 ms
FrameStart: 17.12 ms
FrameStart: 15.85 ms
FrameStart: 23.19 ms
FrameStart: 14.38 ms
FrameStart: 13.27 ms
FrameStart: 15.73 ms
FrameStart: 15.57 ms
FrameStart: 16.79 ms
FrameStart: 14.64 ms
FrameStart: 18.11 ms
FrameStart: 17.45 ms
FrameStart: 16.11 ms
FrameStart: 18.61 ms
现在,它们的平均值约为16.66ms,但在13-23ms之间有很大的差异。 我误解了吗?我是否有一个不定期更新的奇怪显示器?这是一个浏览器错误吗?
有人能解释发生了什么事吗

这是正常的,您不能期望每个帧都精确地花费16.66毫秒来渲染。它受到许多因素的影响,如GPU/CPU/内存使用、用户输入,甚至您的
logTimestamp
都可能会降低速度。以60帧为例,大约每帧16.66ms。听起来我需要跟踪累积误差。如果它低于我的源帧速率的一半(也就是60FPS),我可以重复一帧,如果超过一半,我应该放弃一帧。然后停止思考,好像它直接类似于一个垂直空白中断。重新分析我的帧跟踪数据记住,有很多地方它走得太慢(如上面的23.19),然后尝试立即纠正一个或两个短帧(14.39和13.27)。这似乎仍然是错误的-监视器以严格的16.66ms运行,因此其中一帧永远不会显示,那么为什么要调用回调?