Как подключить цикл анимации или игровой цикл со скоростью 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, который вам может пригодиться.