Add support for application.frameRate

This commit is contained in:
Joshua Granick
2015-05-14 16:29:31 -07:00
parent 2ebbb58493
commit cb87783f2b
8 changed files with 171 additions and 19 deletions

View File

@@ -33,6 +33,8 @@ class FlashApplication {
this.parent = parent; this.parent = parent;
Lib.current.stage.frameRate = 60;
AudioManager.init (); AudioManager.init ();
} }
@@ -106,6 +108,7 @@ class FlashApplication {
if (config != null) { if (config != null) {
setFrameRate (config.fps);
var window = new Window (config); var window = new Window (config);
var renderer = new Renderer (window); var renderer = new Renderer (window);
parent.addWindow (window); parent.addWindow (window);
@@ -152,6 +155,13 @@ class FlashApplication {
} }
public function getFrameRate ():Float {
return Lib.current.stage.frameRate;
}
private function handleKeyEvent (event:KeyboardEvent):Void { private function handleKeyEvent (event:KeyboardEvent):Void {
if (parent.window != null) { if (parent.window != null) {
@@ -314,4 +324,11 @@ class FlashApplication {
} }
public function setFrameRate (value:Float):Float {
return Lib.current.stage.frameRate = value;
}
} }

View File

@@ -20,7 +20,11 @@ import lime.ui.Window;
class HTML5Application { class HTML5Application {
private var cacheTime:Float; private var currentUpdate:Float;
private var deltaTime:Float;
private var framePeriod:Float;
private var lastUpdate:Float;
private var nextUpdate:Float;
private var parent:Application; private var parent:Application;
#if stats #if stats
private var stats:Dynamic; private var stats:Dynamic;
@@ -31,6 +35,11 @@ class HTML5Application {
this.parent = parent; this.parent = parent;
currentUpdate = 0;
lastUpdate = 0;
nextUpdate = 0;
framePeriod = -1;
AudioManager.init (); AudioManager.init ();
} }
@@ -141,7 +150,7 @@ class HTML5Application {
window.requestAnimFrame = window.requestAnimationFrame; window.requestAnimFrame = window.requestAnimationFrame;
"); ");
cacheTime = Date.now ().getTime (); lastUpdate = Date.now ().getTime ();
handleUpdateEvent (); handleUpdateEvent ();
@@ -150,6 +159,25 @@ class HTML5Application {
} }
public function getFrameRate ():Float {
if (framePeriod < 0) {
return 60;
} else if (framePeriod == 1000) {
return 0;
} else {
return 1000 / framePeriod;
}
}
private function handleKeyEvent (event:KeyboardEvent):Void { private function handleKeyEvent (event:KeyboardEvent):Void {
if (parent.window != null) { if (parent.window != null) {
@@ -189,27 +217,51 @@ class HTML5Application {
private function handleUpdateEvent (?__):Void { private function handleUpdateEvent (?__):Void {
#if stats currentUpdate = Date.now ().getTime ();
stats.begin ();
#end
var currentTime = Date.now ().getTime (); if (currentUpdate >= nextUpdate) {
var deltaTime = currentTime - cacheTime;
cacheTime = currentTime;
parent.onUpdate.dispatch (Std.int (deltaTime));
if (parent.renderer != null) {
parent.renderer.onRender.dispatch (parent.renderer.context); #if stats
parent.renderer.flip (); stats.begin ();
#end
deltaTime = currentUpdate - lastUpdate;
parent.onUpdate.dispatch (Std.int (deltaTime));
if (parent.renderer != null) {
parent.renderer.onRender.dispatch (parent.renderer.context);
parent.renderer.flip ();
}
#if stats
stats.end ();
#end
if (framePeriod < 0) {
nextUpdate = currentUpdate;
nextUpdate = currentUpdate;
} else {
nextUpdate = currentUpdate + framePeriod;
//while (nextUpdate <= currentUpdate) {
//
//nextUpdate += framePeriod;
//
//}
}
lastUpdate = currentUpdate;
} }
#if stats
stats.end ();
#end
Browser.window.requestAnimationFrame (cast handleUpdateEvent); Browser.window.requestAnimationFrame (cast handleUpdateEvent);
} }
@@ -255,4 +307,25 @@ class HTML5Application {
} }
public function setFrameRate (value:Float):Float {
if (value >= 60) {
framePeriod = -1;
} else if (value > 0) {
framePeriod = 1000 / value;
} else {
framePeriod = 1000;
}
return value;
}
} }

View File

@@ -34,12 +34,14 @@ class NativeApplication {
public var handle:Dynamic; public var handle:Dynamic;
private var frameRate:Float;
private var parent:Application; private var parent:Application;
public function new (parent:Application):Void { public function new (parent:Application):Void {
this.parent = parent; this.parent = parent;
frameRate = 60;
AudioManager.init (); AudioManager.init ();
@@ -54,6 +56,7 @@ class NativeApplication {
if (config != null) { if (config != null) {
setFrameRate (config.fps);
var window = new Window (config); var window = new Window (config);
var renderer = new Renderer (window); var renderer = new Renderer (window);
parent.addWindow (window); parent.addWindow (window);
@@ -112,6 +115,13 @@ class NativeApplication {
} }
public function getFrameRate ():Float {
return frameRate;
}
private function handleGamepadEvent ():Void { private function handleGamepadEvent ():Void {
if (parent.window != null) { if (parent.window != null) {
@@ -359,6 +369,14 @@ class NativeApplication {
} }
public function setFrameRate (value:Float):Float {
lime_application_set_frame_rate (handle, value);
return frameRate = value;
}
private function updateTimer ():Void { private function updateTimer ():Void {
if (Timer.sRunningTimers.length > 0) { if (Timer.sRunningTimers.length > 0) {
@@ -409,6 +427,7 @@ class NativeApplication {
private static var lime_application_create = System.load ("lime", "lime_application_create", 1); private static var lime_application_create = System.load ("lime", "lime_application_create", 1);
private static var lime_application_exec = System.load ("lime", "lime_application_exec", 1); private static var lime_application_exec = System.load ("lime", "lime_application_exec", 1);
private static var lime_application_init = System.load ("lime", "lime_application_init", 1); private static var lime_application_init = System.load ("lime", "lime_application_init", 1);
private static var lime_application_set_frame_rate = System.load ("lime", "lime_application_set_frame_rate", 2);
private static var lime_application_update = System.load ("lime", "lime_application_update", 1); private static var lime_application_update = System.load ("lime", "lime_application_update", 1);
private static var lime_application_quit = System.load ("lime", "lime_application_quit", 1); private static var lime_application_quit = System.load ("lime", "lime_application_quit", 1);
private static var lime_gamepad_event_manager_register = System.load ("lime", "lime_gamepad_event_manager_register", 2); private static var lime_gamepad_event_manager_register = System.load ("lime", "lime_gamepad_event_manager_register", 2);

View File

@@ -23,6 +23,7 @@ class Application extends Module {
public static var current (default, null):Application; public static var current (default, null):Application;
public var config (default, null):Config; public var config (default, null):Config;
public var frameRate (get, set):Float;
public var modules (default, null):Array<IModule>; public var modules (default, null):Array<IModule>;
/** /**
@@ -589,6 +590,20 @@ class Application extends Module {
@:noCompletion private inline function get_frameRate ():Float {
return backend.getFrameRate ();
}
@:noCompletion private inline function set_frameRate (value:Float):Float {
return backend.setFrameRate (value);
}
@:noCompletion private inline function get_renderer ():Renderer { @:noCompletion private inline function get_renderer ():Renderer {
return renderers[0]; return renderers[0];

View File

@@ -18,6 +18,7 @@ namespace lime {
virtual int Exec () = 0; virtual int Exec () = 0;
virtual void Init () = 0; virtual void Init () = 0;
virtual int Quit () = 0; virtual int Quit () = 0;
virtual void SetFrameRate (double frameRate) = 0;
virtual bool Update () = 0; virtual bool Update () = 0;

View File

@@ -74,6 +74,15 @@ namespace lime {
} }
value lime_application_set_frame_rate (value application, value frameRate) {
Application* app = (Application*)(intptr_t)val_float (application);
app->SetFrameRate (val_number (frameRate));
return alloc_null ();
}
value lime_application_update (value application) { value lime_application_update (value application) {
Application* app = (Application*)(intptr_t)val_float (application); Application* app = (Application*)(intptr_t)val_float (application);
@@ -992,6 +1001,7 @@ namespace lime {
DEFINE_PRIM (lime_application_exec, 1); DEFINE_PRIM (lime_application_exec, 1);
DEFINE_PRIM (lime_application_init, 1); DEFINE_PRIM (lime_application_init, 1);
DEFINE_PRIM (lime_application_quit, 1); DEFINE_PRIM (lime_application_quit, 1);
DEFINE_PRIM (lime_application_set_frame_rate, 2);
DEFINE_PRIM (lime_application_update, 1); DEFINE_PRIM (lime_application_update, 1);
DEFINE_PRIM (lime_audio_load, 1); DEFINE_PRIM (lime_audio_load, 1);
DEFINE_PRIM (lime_font_get_ascender, 1); DEFINE_PRIM (lime_font_get_ascender, 1);

View File

@@ -27,6 +27,8 @@ namespace lime {
currentApplication = this; currentApplication = this;
framePeriod = 1000.0 / 60.0;
#ifdef EMSCRIPTEN #ifdef EMSCRIPTEN
emscripten_cancel_main_loop (); emscripten_cancel_main_loop ();
emscripten_set_main_loop (UpdateFrame, 0, 0); emscripten_set_main_loop (UpdateFrame, 0, 0);
@@ -203,7 +205,6 @@ namespace lime {
void SDLApplication::Init () { void SDLApplication::Init () {
framePeriod = 1000.0 / 60.0;
active = true; active = true;
lastUpdate = SDL_GetTicks (); lastUpdate = SDL_GetTicks ();
nextUpdate = lastUpdate; nextUpdate = lastUpdate;
@@ -441,6 +442,21 @@ namespace lime {
} }
void SDLApplication::SetFrameRate (double frameRate) {
if (frameRate > 0) {
framePeriod = 1000.0 / frameRate;
} else {
framePeriod = 1000.0;
}
}
static SDL_TimerID timerID = 0; static SDL_TimerID timerID = 0;
bool timerActive = false; bool timerActive = false;
bool firstTime = true; bool firstTime = true;

View File

@@ -28,6 +28,7 @@ namespace lime {
virtual int Exec (); virtual int Exec ();
virtual void Init (); virtual void Init ();
virtual int Quit (); virtual int Quit ();
virtual void SetFrameRate (double frameRate);
virtual bool Update (); virtual bool Update ();
void RegisterWindow (SDLWindow *window); void RegisterWindow (SDLWindow *window);