flutter / flutter/devtools

"Average FPS" is calculated wrongly - for example, a 30FPS case is reported ~45FPS

未关闭
#4,522 0 条评论 1 个 reaction 已指派 0 人 在 GitHub 查看
needs discussion P2 screen: performance
主要语言
Dart
星标
1.7k
派生
404
平均合并
6 天 17 小时
30 天内合并 PR
18

描述

## Suspected cause

The FPS should be calculated as "how many frames (i.e. new pictures) are shown on the screen per second", instead of "how long does the ui thread take to compute one frame", because the latter forgets the idle time in the ui thread also counts.

## Description

Run the code (better in profile mode)

```dart
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
@override
State createState() => _MyAppState();
}

class _MyAppState extends State {
var count = 0;

@override
Widget build(BuildContext context) {
sleep(const Duration(milliseconds: 17));
count++;
SchedulerBinding.instance.addPostFrameCallback((_) => setState(() {}));
return MaterialApp(home: Scaffold(body: Center(child: Text('$count'))));
}
}
```

Open devtool and see: (notice it says "45fps")

![image](https://user-images.githubusercontent.com/5236035/192140428-503adfbe-ecf2-4abe-8aad-5ac39c597414.png)

zoom in and see: (left of "1" is 1244325196370 μs, left of "2" is 1244325497120 μs)

![image](https://user-images.githubusercontent.com/5236035/192140439-71d75135-6d57-40e6-a4af-96f1442f7d51.png)

By simple math, (1244325497120-1244325196370)/9 = 33.416ms, we know between each rasterization there are nearly 33.416 ms. This is exactly 33.333ms which is 30FPS!

Thus, in this simple example, it should say 30FPS but wrongly report 45FPS.

贡献指南

打开贡献指南

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。