【问题标题】:requestAnimationFrame() performance issuerequestAnimationFrame() 性能问题
【发布时间】:2016-11-11 07:59:37
【问题描述】:

我遇到了 requestAnimationFrame() 的性能问题。

考虑以下代码。这是一个简单的循环,每次这个时间增量大于 20 毫秒时打印自上一帧以来的时间。

const glob_time_info = {delta_time: 0.0, last_frame: performance.now()};

var render = function (timestamp) {
    glob_time_info.delta_time = timestamp - glob_time_info.last_frame;
    glob_time_info.last_frame = timestamp; 
    if(glob_time_info.delta_time > 20)
        console.log(glob_time_info.delta_time);
    requestAnimationFrame(render);
};
render(performance.now());

据我了解 requestAnimationFrame 这个 sn-p 不应该打印任何东西,因为它试图每秒运行 60 次(60Hz 作为我的显示器)。 因此,时间增量应始终在 16-17 毫秒左右。

但它每隔几秒打印一次大约 33 毫秒。 为什么?

我在 Windows 10 上使用 Chrome 54 和 Firefox 49 遇到过这种情况。我拥有一台 i5-6600


更新 这里是 Nit 的 windows 和 ubuntu 脚本的输出。窗户,你在做什么? 视窗 10(电脑): WIndows 8(与以下相同的上网本): Ubuntu(与上面相同的上网本):

【问题讨论】:

  • 它被固定在 16 并且当我运行它时会改变。可能与垃圾收集和您的计算机正在执行的其他操作有关。
  • "tries" 是关键字,如果有东西阻塞了线程,即使是几毫秒,它也不再成功
  • 我也想过GC,但是每隔几秒?以及他必须收集什么 :) 如果每隔几秒帧速率下降到 30FPS 或更差,你如何制作流畅的动画
  • And how can you make smooth animations if every few seconds the framerate drops down to 30FPS or worse - 通过使动画基于时间而不是基于帧
  • 这很可能与操作系统运行 CPU 的方式有关,而不是与您的代码有关。

标签: javascript requestanimationframe


【解决方案1】:

很容易检验您的假设,即问题与您所运行的平台有关 - 衡量性能。

简而言之,运行requestAnimationFrame 的次数与您所做的类似,并记下每次运行的时间戳。然后简单地可视化结果。

var times = [];
var measure = function() {
  times.push(new Date().getTime());
  if (times.length > 100) return draw();
  requestAnimationFrame(measure);
};
var draw = function() {
  var dataset = {
    x: [],
    y: [],
    type: 'bar'
  };
  var layout = {
    xaxis: {
      title: 'measurement #'
    },
    yaxis: {
      title: 'iteration duration (ms)'
    },
    height: 250
  };
  var options = {
    displayModeBar: false
  };
  times.reduce(function(previous, current, i) {
    dataset.x.push(i);
    dataset.y.push(current - previous);
    return current;
  }, times.shift());
  Plotly.newPlot('target', [dataset], layout, options);
}
measure();
#target {
  margin-top: -50px;
}
<script src="https://cdn.plot.ly/plotly-1.2.0.min.js"></script>
<div id="target"></div>

您可以在不同的操作系统和不同的浏览器上运行相同的模拟,看看是否可以进一步缩小问题范围。

【讨论】:

  • 谢谢!我把图片放在问题里。
【解决方案2】:

正如 Travis J 在 cmets 中所说,它与操作系统有关。

这个性能问题不会出现在 linux 上。所以我(我们)对此无能为力。

【讨论】:

  • “它与操作系统有关” --- 好吧,这里是 Windows 10 和功能较弱的 CPU:我每次迭代需要 15-16 毫秒。
  • 我也有 15-16 毫秒,但每隔几秒就会出现峰值。你试过我的代码 sn-p 吗?
  • 不,我从另一个答案运行一个。
  • 我在问题中添加了图表
  • 是的,看起来不错!诡异的。我们需要用户研究,更多数据! :)
猜你喜欢
  • 1970-01-01
  • 2013-10-24
  • 2013-06-10
  • 2012-10-11
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
相关资源
最近更新 更多