RenderLoop
class
class RenderLoop {
Juggler _juggler = new Juggler();
List<Stage> _stages = new List<Stage>();
num _renderTime = -1;
int _requestId = null;
bool _invalidate = false;
EnterFrameEvent _enterFrameEvent = new EnterFrameEvent(0);
ExitFrameEvent _exitFrameEvent = new ExitFrameEvent();
RenderEvent _renderEvent = new RenderEvent();
RenderLoop() {
start();
}
Juggler get juggler => _juggler;
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
void start() {
_renderTime = -1;
_requestAnimationFrame();
}
void stop() {
_cancelAnimationFrame();
}
void invalidate() {
_invalidate = true;
}
void addStage(Stage stage) {
if (stage.renderLoop != null) {
stage.renderLoop.removeStage(stage);
}
_stages.add(stage);
stage._renderLoop = this;
}
void removeStage(Stage stage) {
if (stage.renderLoop == this) {
_stages.remove(stage);
stage._renderLoop = null;
}
}
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
_requestAnimationFrame() {
if (_requestId == null) {
_requestId = html.window.requestAnimationFrame(_onAnimationFrame);
}
}
_cancelAnimationFrame() {
if (_requestId != null) {
html.window.cancelAnimationFrame(_requestId);
_requestId = null;
}
}
_onAnimationFrame(num currentTime) {
_requestId = null;
_requestAnimationFrame();
currentTime = currentTime.toDouble();
if (_renderTime == -1) _renderTime = currentTime;
if (_renderTime > currentTime) _renderTime = currentTime;
var deltaTime = currentTime - _renderTime;
var deltaTimeSec = deltaTime / 1000.0;
var currentTimeSec = currentTime / 1000.0;
var invalidate = false;
if (deltaTime >= 1) {
_renderTime = currentTime;
_enterFrameEvent._passedTime = deltaTimeSec;
_dispatchBroadcastEvent(_enterFrameEvent, _enterFrameSubscriptions);
_juggler.advanceTime(deltaTimeSec);
for(int i = 0; i < _stages.length; i++) {
_stages[i].juggler.advanceTime(deltaTimeSec);
}
if (_invalidate) {
_invalidate = false;
_dispatchBroadcastEvent(_renderEvent, _renderSubscriptions);
}
for(int i = 0; i < _stages.length; i++) {
_stages[i].materialize(currentTimeSec, deltaTimeSec);
}
_dispatchBroadcastEvent(_exitFrameEvent, _exitFrameSubscriptions);
}
}
}
Constructors
new RenderLoop() #
Creates a new Object instance.
Object instances have no meaningful state, and are only useful
through their identity. An Object instance is equal to itself
only.
RenderLoop() {
start();
}
Properties
final Juggler juggler #
Juggler get juggler => _juggler;
Methods
void addStage(Stage stage) #
void addStage(Stage stage) {
if (stage.renderLoop != null) {
stage.renderLoop.removeStage(stage);
}
_stages.add(stage);
stage._renderLoop = this;
}
void invalidate() #
void invalidate() {
_invalidate = true;
}
void removeStage(Stage stage) #
void removeStage(Stage stage) {
if (stage.renderLoop == this) {
_stages.remove(stage);
stage._renderLoop = null;
}
}
void start() #
void start() {
_renderTime = -1;
_requestAnimationFrame();
}
void stop() #
void stop() {
_cancelAnimationFrame();
}