Как подключить цикл анимации или игровой цикл со скоростью 60 кадров в секунду в веб-приложении Dart?
Как мне управлять циклом анимации со скоростью 60 кадров в секунду с помощью Dart и Интернета?
Ответ 1
Используйте window.animationFrame, двоюродный брат традиционного window.requestAnimationFrame, основанный на будущем.
Dart переключается на использование Future и Stream как более объектно-ориентированные способы для обработки асинхронных операций. Основанный на обратном вызове (старый "n busted" ) requestAnimationFrame заменяется будущей (новая горячность) animationFrame.
Вот пример:
import 'dart:html';
gameLoop(num delta) {
// do stuff
window.animationFrame.then(gameLoop);
}
void main() {
window.animationFrame.then(gameLoop);
}
Подпись animationFrame выглядит так:
Future<num> animationFrame();
Обратите внимание, что animationFrame возвращает Будущее, которое заканчивается с помощью num, которое содержит "таймер высокой производительности", аналогичный window.performance.now(). num является монотонно увеличивающейся дельтой между теперь и началом страницы. Он имеет разрешение в микросекундах.
Будущее завершается прямо перед тем, как браузер будет рисовать страницу. Обновите состояние своего мира и нарисуйте все, когда это будущее завершается.
Вы должны запросить новое будущее из анимации в каждом кадре, если хотите, чтобы анимация или цикл продолжались. В этом примере регистры gameLoop() должны быть уведомлены о следующем анимационном кадре.
Кстати, есть паб-пакет с именем game_loop, который вам может пригодиться.