flutter / flutter/devtools

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

Abierto
#4,522 0 comentarios 1 reacción 0 asignados Ver en GitHub
needs discussion P2 screen: performance
Lenguaje dominante
Dart
Estrellas
1.7k
Forks
404
Merge medio
6 d 17 h
PR fusionados (30 d)
18

Descripción

## 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.

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.