如何在Dart Web应用程序中以60fps驱动动画循环或游戏循环?
解决方法
使用window.animationFrame,传统window.requestAnimationFrame的基于Future的表兄弟.
Dart一直在转向使用Future和Stream作为处理异步操作的更多面向对象的方法.基于回调(new’n busted)的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,它包含一个类似于window.performance.now()的“高性能计时器”.从现在到页面开始时,num是单调递增的增量.它具有微秒分辨率.
在浏览器绘制页面之前,Future就完成了.更新您的世界状态,并在此未来完成时绘制所有内容.
如果希望动画或循环继续,则必须在每帧上从animationFrame请求新的Future.在此示例中,gameLoop()注册以在下一个动画帧上得到通知.
BTW有一个名为game_loop的pub包,你可能觉得它很有用.