Improve frame timing

This commit is contained in:
Joshua Granick
2014-07-07 02:35:16 -07:00
parent 99fad47f69
commit 86d0644f06
2 changed files with 18 additions and 18 deletions

View File

@@ -55,12 +55,13 @@ namespace lime {
int SDLApplication::Exec () {
framePeriod = 1000.0 / 60.0;
SDL_Event event;
active = true;
lastUpdate = SDL_GetTicks ();
nextUpdate = lastUpdate;
bool firstTime = true;
Uint32 nextUpdate = lastUpdate;
while (active) {
@@ -70,14 +71,6 @@ namespace lime {
firstTime = false;
if (timerActive && timerID) {
SDL_RemoveTimer (timerID);
timerActive = false;
timerID = 0;
}
HandleEvent (&event);
event.type = -1;
if (!active) break;
@@ -92,18 +85,15 @@ namespace lime {
currentUpdate = SDL_GetTicks ();
if (currentUpdate - lastUpdate < 16) {
if (currentUpdate >= nextUpdate) {
lastUpdate = currentUpdate;
SDL_RemoveTimer (timerID);
OnTimer (0, 0);
} else if (!timerActive) {
timerActive = true;
timerID = SDL_AddTimer (lastUpdate + 16 - currentUpdate, OnTimer, 0);
} else {
lastUpdate = currentUpdate;
OnTimer (0, 0);
timerID = SDL_AddTimer (nextUpdate - currentUpdate, OnTimer, 0);
}
@@ -129,6 +119,14 @@ namespace lime {
currentUpdate = SDL_GetTicks ();
updateEvent.deltaTime = currentUpdate - lastUpdate;
lastUpdate = currentUpdate;
while (nextUpdate <= currentUpdate) {
nextUpdate += framePeriod;
}
UpdateEvent::Dispatch (&updateEvent);
RenderEvent::Dispatch (&renderEvent);
break;

View File

@@ -34,9 +34,11 @@ namespace lime {
bool active;
Uint32 currentUpdate;
double framePeriod;
KeyEvent keyEvent;
Uint32 lastUpdate;
MouseEvent mouseEvent;
double nextUpdate;
RenderEvent renderEvent;
TouchEvent touchEvent;
UpdateEvent updateEvent;