如何在DART Web应用程序中以60fps的速度驱动动画循环或游戏循环?

推荐答案

使用window.animationFrame,它是传统window.requestAnimationFrame的基于future 的表亲.

DART已经转向使用FutureStream作为更面向对象的方式来处理异步操作.基于回调的(旧的被 destruct 的)requestAnimationFrame被基于future 的(新的热度)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完成的future ,num包含一个类似于window.performance.now()的"高性能计时器".从现在到页面开始,num是一个单调递增的增量.它的分辨率为微秒.

在浏览器开始绘制页面之前,"future "就已经完成了.当这个future 完成时,更新您的世界状态并绘制所有内容.

如果希望动画或循环继续,则必须在每一帧上从animationFrame请求一个新的future .在本例中,gameLoop()个寄存器将在下一个动画帧上收到通知.

顺便说一句,有一个名为game_loop的wine 吧套餐,你可能会发现它很有用.

Dart相关问答推荐

在Dart中进行系统调用?

如何从 Flutter App 连接 Ms SQL?

如何在flutter中使用rootBundle加载图片?

LinearProgressIndicator Flutter使用

在 Dart 中将对象推入数组

如何从Flatter应用程序中导航到网页?(OAuth)

Dart-对base64字符串进行编码和解码

如何从目录中获取文件列表并将其传递给ListView?

Flutter: shared preferences

如何平移和zoom 图像?

Dart 语法高亮不是高亮 dart 代码

Dart 库中part和part of背后的原因是什么?

如何创建类型别名

Dart:你如何让 Future 等待 Stream?

从 Dart 应用访问 pubspec.yaml 属性

Dart 会支持服务器端开发吗?

Dart 脚本会在浏览器中本地运行吗?

getter 和 setter 如何改变 Dart 中的属性?

Dart 语言中的 Console.log

如何在构造函数中初始化最终类属性?