Skip to content

Commit

Permalink
Run animations no more than once per frame
Browse files Browse the repository at this point in the history
Animating frames we can't see is a waste of CPU
  • Loading branch information
TellowKrinkle committed Jun 10, 2021
1 parent 84327a5 commit 53bb96d
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 7 deletions.
2 changes: 1 addition & 1 deletion src/PonscripterLabel.h
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,7 @@ class PonscripterLabel : public ScriptParser {
void mousePressEvent(SDL_MouseButtonEvent* event);
void mouseWheelEvent(SDL_MouseWheelEvent* event);
void mouseMoveEvent(SDL_MouseMotionEvent* event);
void timerEvent();
bool timerEvent();
void flushEventSub(SDL_Event &event);
void flushEvent();
void startTimer(int count);
Expand Down
15 changes: 9 additions & 6 deletions src/PonscripterLabel_event.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1087,12 +1087,12 @@ void PonscripterLabel::keyPressEvent(SDL_KeyboardEvent* event)
}
}


void PonscripterLabel::timerEvent(void)
// Returns true if the next timer event should be delayed until the next frame
bool PonscripterLabel::timerEvent(void)
{
timerEventTop:

int ret;
bool ret = false;

if (event_mode & WAIT_TIMER_MODE) {
int duration = proceedAnimation();
Expand Down Expand Up @@ -1162,9 +1162,10 @@ void PonscripterLabel::timerEvent(void)
script_h.setCurrent(current);
readToken();
advancePhase();
ret = true;
}

return;
return ret;
}
else {
if (system_menu_mode != SYSTEM_NULL
Expand All @@ -1180,6 +1181,7 @@ void PonscripterLabel::timerEvent(void)
}

volatile_button_state.button = 0;
return ret;
}

Uint32 PonscripterLabel::getRefreshRateDelay() {
Expand Down Expand Up @@ -1384,8 +1386,9 @@ int PonscripterLabel::eventLoop()
if(SDL_PeepEvents(&tmp_event, 1, SDL_PEEKEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT) == 0) {
if(timer_event_flag && timer_event_time <= current_time) {
timer_event_flag = false;

timerEvent();
if (timerEvent() && timer_event_time <= last_refresh + refresh_delay) {
timer_event_time = last_refresh + refresh_delay;
}
} else if(last_refresh <= current_time && refresh_delay >= (current_time - last_refresh)) {
SDL_Delay(std::min(refresh_delay / 3, refresh_delay - (current_time - last_refresh)));
}
Expand Down

0 comments on commit 53bb96d

Please sign in to comment.