如何在 chrome devtools 中获取 FPS

Posted

技术标签:

【中文标题】如何在 chrome devtools 中获取 FPS【英文标题】:How to get the FPS in chrome devtools 【发布时间】:2018-01-03 14:45:50 【问题描述】:

我想检索测量的性能记录的平均 fps。

到目前为止,我只能通过将鼠标悬停在这样的帧上来获得每帧的持续时间和 fps:

或通过选择框架:

要得到所有帧的平均fps,我必须手动将它们一一相加,这很不方便。


例如,Firefox devtools 在面板的右上角显示平均 fps。

【问题讨论】:

页面本身只有一个单独的 FPS 仪表覆盖层,您可以在 devtools bottom drawer -> Rendering -> FPS meter 中启用它。 @drawer 但这只会显示当前的 fps 而不是平均值,还是我遗漏了什么? 显然没有实现。另见crbug.com/627925 如果您需要此功能,请评论并为 wOxxOm 链接到的 Crbug 问题加注星标。目前它被归档为低优先级。 【参考方案1】:

您可以使用 devtools-for-devtools。

    将 devtools 切换到分离窗口模式(单击 devtools 设置图标,单击“取消停靠”图标)。下次您只需按 Ctrl-Shift-D 即可切换模式。 按 Ctrl-Shift-i 调用 devtools-for-devtools

显示所有帧的 FPS:

UI.panels.timeline._flameChart._model._frameModel._frames.slice(1).map(f => +(1000 / f.duration).toFixed(1))

显示平均 FPS:

+UI.panels.timeline._flameChart._model._frameModel._frames.slice(1).map(f => 1000 / f.duration).reduce((avg, fps, i) => (avg*i + fps) / (i+1), 0).toFixed(1)

您可以将此代码保存为 devtools Snippets panel 中的 sn-ps 并在上述步骤 2 之后调用它。

【讨论】:

这太棒了!我不知道我可以在 devtools 窗口中使用 devtools。 对于那些可能对在哪里添加它感到困惑的人,打开第二个 DevTool 后,将上面的代码粘贴到控制台中。【参考方案2】:

感谢@wOxxOm 指出如何在the answer above 中为 DevTools 访问 DevTools。

但是,计算平均 FPS 的代码并不完全正确。例如,如果有一帧渲染需要一秒钟,那么该帧的 fps 为 1。如果有另一个帧需要 (1000 / 60) 毫秒来渲染,那么该帧的 fps 为 60。原始代码将给出这两个帧的平均 fps 为 (60 + 1) / 2,这是不正确的。

正确的平均 fps 是总帧数除以总时长。在这个例子中,它是2 / (1 + 1 / 60) fps。

实现这一点的一种方法是:

function averageFps() 
    let frames = UI.panels.timeline._flameChart._model._frameModel._frames;
    let duration = (frames[frames.length - 1].endTime - frames[0].startTime) / 1000;
    let average = frames.length / duration

    return +average.toFixed(2);

【讨论】:

【参考方案3】:

请注意,API 似乎对此略有更改,因此现在完成此操作的新代码是:

let frames = UI.panels.timeline.flameChart.model.frameModelInternal.frames;

let frameSet = [];
let startTimeMs = UI.panels.timeline.flameChart.model.window().left;
let endTimeMs = UI.panels.timeline.flameChart.model.window().right;

let minFPS = 1000;
let maxFPS = -1;
let totalFPS = 0;

for (let frameIdx in frames) 
    let frame = frames[frameIdx];
    if (frame.startTime >= startTimeMs && endTimeMs >= frame.endTime) 
        frameSet.push(frame);
        let frameRate = (16.0/frame.duration) * 60;
      
        if (maxFPS < frameRate) 
          maxFPS = frameRate;
                

        if (minFPS > frameRate) 
          minFPS = frameRate;
        

        totalFPS += frameRate;
    


console.log(`Total Frames: $frameSet.length`);
console.log(`Min FPS: $minFPS`);
console.log(`Max FPS: $maxFPS`);
console.log(`Average FPS: $totalFPS / frameSet.length`);

【讨论】:

有人知道这个UI API 上是否有文档吗? 我喜欢你的 sn-p,但是对于 97.0.4692.99 版的 Chrome,我仍然需要使用 API 的下划线版本。这个新的 API 什么时候开始发挥作用? @Chris Blackwell 让我检查一下我的 Chrome 版本并回复你。 @ChrisBlackwell 看起来我在 Ubuntu Linux(实际上是 PopOS,但它基于 Ubuntu)上使用的是 96.0.4664.110 版本。我想知道我是否有一个 old API。我会看看我是否可以调查一下。【参考方案4】:

更新了@Daniel Le 考虑当前选定范围的解决方案

var startTime = UI.panels.timeline._flameChart._model._window.left;
var endTime = UI.panels.timeline._flameChart._model._window.right;

var frames = UI.panels.timeline._flameChart._model._frameModel._frames
  .filter(frame => (frame.startTime > startTime) && (frame.endTime < endTime));

var duration = (frames[frames.length - 1].endTime - frames[0].startTime) / 1000;
var average = frames.length / duration

console.log(+average.toFixed(2));

【讨论】:

【参考方案5】:

更新代码: 显示所有帧的 FPS:

UI.panels.timeline.flameChart.model
.frameModel().frames.slice(1).map(f => +(1000 / f.duration).toFixed(1))

显示平均 FPS:

UI.panels.timeline.flameChart.model.frameModel()
.frames.slice(1).map(f => 1000 / f.duration)
.reduce((avg, fps, i) => (avg*i + fps) / (i+1), 0).toFixed(1)

【讨论】:

以上是关于如何在 chrome devtools 中获取 FPS的主要内容,如果未能解决你的问题,请参考以下文章

chrome浏览器添加vue-devtools扩展

在 Chrome DevTools 中搜索 HTML 元素

Chrome 扩展,获取 devtools HAR 数据

使用 selenium 获取 Chrome Devtools 内容的 Python 脚本

Chrome DevTools 获取 websocket 地址

text 通过DevTools CLI获取Chrome版本