Browse Source

cache ProgressToNextGameTick and update it only once before rendering

pull/1502/head
obligaron 5 years ago committed by Anders Jenbo
parent
commit
9fbe139f64
  1. 23
      Source/nthread.cpp
  2. 3
      Source/nthread.h
  3. 2
      Source/player.cpp
  4. 2
      Source/scrollrt.cpp

23
Source/nthread.cpp

@ -24,6 +24,7 @@ bool sgbThreadIsRunning;
DWORD gdwLargestMsgSize; DWORD gdwLargestMsgSize;
DWORD gdwNormalMsgSize; DWORD gdwNormalMsgSize;
int last_tick; int last_tick;
float gfProgressToNextGameTick = 0.0f;
/* data */ /* data */
static SDL_Thread *sghThread = NULL; static SDL_Thread *sghThread = NULL;
@ -242,21 +243,23 @@ bool nthread_has_500ms_passed()
return ticksElapsed >= 0; return ticksElapsed >= 0;
} }
float nthread_GetProgressToNextGameTick() void nthread_UpdateProgressToNextGameTick()
{ {
if (!gbRunGame || PauseMode || (!gbIsMultiplayer && gmenu_is_active())) // if game is not running or paused there is no next gametick in the near future if (!gbRunGame || PauseMode || (!gbIsMultiplayer && gmenu_is_active())) // if game is not running or paused there is no next gametick in the near future
return 0.0f; return;
int currentTickCount = SDL_GetTicks(); int currentTickCount = SDL_GetTicks();
int ticksElapsed = last_tick - currentTickCount; int ticksElapsed = last_tick - currentTickCount;
if (ticksElapsed <= 0) if (ticksElapsed <= 0) {
return 1.0f; // game tick is due gfProgressToNextGameTick = 1.0f; // game tick is due
return;
}
int ticksAdvanced = gnTickDelay - ticksElapsed; int ticksAdvanced = gnTickDelay - ticksElapsed;
float percent = (float)ticksAdvanced / (float)gnTickDelay; float fraction = (float)ticksAdvanced / (float)gnTickDelay;
if (percent > 1.0f) if (fraction > 1.0f)
return 1.0f; gfProgressToNextGameTick = 1.0f;
if (percent < 0.0f) if (fraction < 0.0f)
return 0.0f; gfProgressToNextGameTick = 0.0f;
return percent; gfProgressToNextGameTick = fraction;
} }
} // namespace devilution } // namespace devilution

3
Source/nthread.h

@ -14,6 +14,7 @@ extern DWORD gdwTurnsInTransit;
extern uintptr_t glpMsgTbl[MAX_PLRS]; extern uintptr_t glpMsgTbl[MAX_PLRS];
extern DWORD gdwLargestMsgSize; extern DWORD gdwLargestMsgSize;
extern DWORD gdwNormalMsgSize; extern DWORD gdwNormalMsgSize;
extern float gfProgressToNextGameTick; // the progress as a fraction (0.0f to 1.0f) in time to the next game tick
void nthread_terminate_game(const char *pszFcn); void nthread_terminate_game(const char *pszFcn);
DWORD nthread_send_and_recv_turn(DWORD cur_turn, int turn_delta); DWORD nthread_send_and_recv_turn(DWORD cur_turn, int turn_delta);
@ -27,6 +28,6 @@ bool nthread_has_500ms_passed();
* @brief Calculates the progress in time to the next game tick * @brief Calculates the progress in time to the next game tick
* @return Progress as a fraction (0.0f to 1.0f) * @return Progress as a fraction (0.0f to 1.0f)
*/ */
float nthread_GetProgressToNextGameTick(); void nthread_UpdateProgressToNextGameTick();
} }

2
Source/player.cpp

@ -3681,7 +3681,7 @@ Sint32 GetFrameToUseForPlayerRendering(const PlayerStruct* pPlayer)
} else { } else {
relevantAnimationLength = pPlayer->_pAnimLen; relevantAnimationLength = pPlayer->_pAnimLen;
} }
float progressToNextGameTick = nthread_GetProgressToNextGameTick(); float progressToNextGameTick = gfProgressToNextGameTick;
float totalGameTicksForCurrentAnimationSequence = progressToNextGameTick + (float)pPlayer->_pAnimGameTicksSinceSequenceStarted; // we don't use the processed game ticks alone but also the fragtion of the next game tick (if a rendering happens between game ticks). This helps to smooth the animations. float totalGameTicksForCurrentAnimationSequence = progressToNextGameTick + (float)pPlayer->_pAnimGameTicksSinceSequenceStarted; // we don't use the processed game ticks alone but also the fragtion of the next game tick (if a rendering happens between game ticks). This helps to smooth the animations.
int animationMaxGameTickets = relevantAnimationLength; int animationMaxGameTickets = relevantAnimationLength;
if (pPlayer->_pAnimDelay > 1) if (pPlayer->_pAnimDelay > 1)

2
Source/scrollrt.cpp

@ -1533,6 +1533,8 @@ void DrawAndBlit()
lock_buf(0); lock_buf(0);
CelOutputBuffer out = GlobalBackBuffer(); CelOutputBuffer out = GlobalBackBuffer();
nthread_UpdateProgressToNextGameTick();
DrawView(out, ViewX, ViewY); DrawView(out, ViewX, ViewY);
if (ctrlPan) { if (ctrlPan) {
DrawCtrlPan(out); DrawCtrlPan(out);

Loading…
Cancel
Save