mirror of
https://github.com/flutter/samples.git
synced 2025-11-10 23:08:59 +00:00
* add package:http dependency in dad_jokes * add package:http dependency in filipino_cuisine * don't build package:http demos until flutter/flutter#34858 is resolved * update gallery * update github_dataviz * update particle_background * don't build github_dataviz (uses package:http) * update slide_puzzle * update spinning_square * update timeflow * update vision_challenge * update charts * update dad_jokes * update filipino cuisine * ignore build output * update timeflow and vision_challenge * update slide_puzzle * don't commit build/ directory * move preview.png images to assets * fix path url join * update readme * update web/readme.md
64 lines
1.4 KiB
Dart
64 lines
1.4 KiB
Dart
import 'dart:collection';
|
|
|
|
class FrameNanny {
|
|
static const _bufferSize = 200;
|
|
static const _maxFrameDuration = Duration(milliseconds: 34);
|
|
final _buffer = ListQueue<Duration>(_bufferSize);
|
|
final _watch = Stopwatch();
|
|
|
|
Duration tick(Duration source) {
|
|
_watch.start();
|
|
_buffer.add(source);
|
|
|
|
while (_buffer.length > _bufferSize) {
|
|
_buffer.removeFirst();
|
|
}
|
|
|
|
if (source > _maxFrameDuration) {
|
|
source = _maxFrameDuration;
|
|
}
|
|
|
|
if (_watch.elapsed > const Duration(seconds: 2)) {
|
|
var goodCount = 0;
|
|
var sum = const Duration();
|
|
Duration best, worst;
|
|
|
|
for (var e in _buffer) {
|
|
sum += e;
|
|
if (e <= _maxFrameDuration) {
|
|
goodCount++;
|
|
}
|
|
|
|
if (best == null || e < best) {
|
|
best = e;
|
|
}
|
|
|
|
if (worst == null || e > worst) {
|
|
worst = e;
|
|
}
|
|
}
|
|
|
|
_watch.reset();
|
|
print([
|
|
'**Nanny**',
|
|
'${(100 * goodCount / _buffer.length).toStringAsFixed(1)}%',
|
|
'<= ${_maxFrameDuration.inMilliseconds}ms',
|
|
'best:',
|
|
best?.inMilliseconds,
|
|
'avg:',
|
|
_safeDivide(sum, _buffer.length),
|
|
'worst',
|
|
worst?.inMilliseconds
|
|
].join(' '));
|
|
}
|
|
return source;
|
|
}
|
|
}
|
|
|
|
Object _safeDivide(Duration source, int divisor) {
|
|
if (divisor == 0) {
|
|
return double.nan;
|
|
}
|
|
return (source ~/ divisor).inMilliseconds;
|
|
}
|