2013-04-01 7 views

Antwort

34

Verwenden Sie window.animationFrame, die Zukunft basierte Cousin der traditionellen window.requestAnimationFrame.

Dart wurde verschoben, um Future und Stream als eher objektorientierte Methoden für asynchrone Operationen zu verwenden. Der Callback-basierte (alte 'n Busted) requestAnimationFrame wird durch den Future-basierten (neue Hotness) animationFrame ersetzt. Hier

ist ein Beispiel:

import 'dart:html'; 

gameLoop(num delta) { 
    // do stuff 
    window.animationFrame.then(gameLoop); 
} 

void main() { 
    window.animationFrame.then(gameLoop); 
} 

Die Signatur von animationFrame wie folgt aussieht:

Future<num> animationFrame(); 

Beachten Sie, wie animationFrame gibt eine Zukunft, die mit einem num abgeschlossen ist, die eine „hohe Leistung hält Timer "ähnlich wie window.performance.now(). Die num ist ein monoton wachsendes Delta zwischen jetzt und wann die Seite gestartet wurde. Es hat Mikrosekundenauflösung.

Die Zukunft wird abgeschlossen, bevor der Browser über das Zeichnen der Seite steht. Aktualisieren Sie den Zustand Ihrer Welt und zeichnen Sie alles, wenn diese Zukunft abgeschlossen ist.

Sie müssen einen neuen Future from animationFrame für jeden Frame anfordern, wenn die Animation oder der Loop fortgesetzt werden soll. In diesem Beispiel werden gameLoop() Register für den nächsten Animationsrahmen gemeldet.

BTW gibt es ein Pub-Paket namens game_loop, die Sie nützlich finden könnten.

+0

Dieser game_loop Link gibt eine 404 – Tgwizman

+0

Hier ist der richtige Ort http://pub.dartlang.org/packages/game_loop – Tgwizman

+1

Wie ist requestAnimationFrame alt 'n busted? Betrachtet man die Quelle, erzeugt der Future basierte animationFrame einen Completer, der durch die Verwendung des ursprünglichen (alten 'n busted) requestAnimationFrame Callbacks ausgelöst wird. – paulecoyote