Игровой цикл Flutter с Timer. periodic (16 мс) имеет нестабильную частоту кадров и низкий FPS на эмуляторе Android/в ИнтAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Игровой цикл Flutter с Timer. periodic (16 мс) имеет нестабильную частоту кадров и низкий FPS на эмуляторе Android/в Инт

Сообщение Anonymous »

У меня есть простой цикл движка во Flutter, управляемый Timer. periodic(const Duration(миллисекунды: 16)).
Даже при небольшом фиксированном внутреннем разрешении сообщаемый 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());
}
}
Моделирование на стороне ЦП идеально выполняется изолированно, поэтому я вполне уверен, что узким местом является то, как я обрабатываю время и представление. Я начинаю подозревать, что Timer. periodic — это просто неправильный инструмент для регулирования частоты кадров в приложении Flutter с интенсивным рендерингом.
Мне интересно, стоит ли мне перейти к чему-то вроде Ticker или SchedulerBinding.scheduleFrameCallback, чтобы оставаться синхронизированным с внутренними часами Flutter. Если я все-таки сделаю этот прыжок или решу полностью отделить логику обновления и рендеринга, какой шаблон лучше всего поможет предотвратить «прерывистый» тайминг и эту ужасную задержку кадров? Я стремлюсь к стабильным 60 кадрам в секунду, но сейчас такое ощущение, что цикл борется с движком, а не работает с ним.

Подробнее здесь: https://stackoverflow.com/questions/798 ... and-low-fp
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»