Даже при небольшом фиксированном внутреннем разрешении сообщаемый FPS может быть очень нестабильным, а производительность низкой в веб-эмуляторе и эмуляторе Android.
Текущий цикл (упрощенный):
Код: Выделить всё
class EngineLoop {
final StreamController _frameController = StreamController.broadcast();
Timer? _timer;
DateTime _lastTick = DateTime.now();
double fps = 0;
double dt = 0;
Stream get frames => _frameController.stream;
void start() {
_timer ??= Timer.periodic(const Duration(milliseconds: 16), (_) => _tick());
}
void _tick() {
final now = DateTime.now();
final elapsed = now.difference(_lastTick).inMicroseconds / 1e6;
_lastTick = now;
final clamped = elapsed.clamp(0.0, 0.1).toDouble();
dt = clamped;
fps = clamped == 0 ? 0 : 1 / clamped;
update(clamped);
draw();
_frameController.add(buildFrame());
}
}
Мне интересно, стоит ли мне перейти к чему-то вроде Ticker или SchedulerBinding.scheduleFrameCallback, чтобы оставаться синхронизированным с внутренними часами Flutter. Если я все-таки сделаю этот прыжок или решу полностью отделить логику обновления и рендеринга, какой шаблон лучше всего поможет предотвратить «прерывистый» тайминг и эту ужасную задержку кадров? Я стремлюсь к стабильным 60 кадрам в секунду, но сейчас такое ощущение, что цикл борется с движком, а не работает с ним.
Подробнее здесь: https://stackoverflow.com/questions/798 ... and-low-fp
Мобильная версия