Slightly revise framerate limiter and r_showfps 2 display

git-svn-id: https://svn.eduke32.com/eduke32@7304 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
terminx 2019-01-12 00:21:53 +00:00
parent 1d74f4e944
commit 6ca492918e
7 changed files with 43 additions and 39 deletions

View file

@ -117,7 +117,7 @@ int32_t g_levelTextTime = 0;
int32_t r_maxfps = 60;
int32_t r_maxfpsoffset = 0;
uint64_t g_frameDelay = 17;
double g_frameDelay = 0.0;
#if defined(RENDERTYPEWIN) && defined(USE_OPENGL)
extern char forcegl;
@ -6130,7 +6130,7 @@ void G_MaybeAllocPlayer(int32_t pnum)
int G_FPSLimit(void)
{
static uint64_t nextPageTicks = 0;
static auto nextPageTicks = (double)timerGetTicksU64();
static unsigned frameWaiting = 0;
if (frameWaiting)
@ -6139,7 +6139,7 @@ int G_FPSLimit(void)
videoNextPage();
}
uint64_t const frameTicks = timerGetTicksU64();
auto const frameTicks = (double)timerGetTicksU64();
if (!r_maxfps || frameTicks >= nextPageTicks)
{
@ -6556,6 +6556,7 @@ int app_main(int argc, char const * const * argv)
ud.setup.bpp = bpp;
}
g_frameDelay = calcFrameDelay(r_maxfps + r_maxfpsoffset);
videoSetPalette(ud.brightness>>2, myplayer.palette, 0);
S_MusicStartup();
S_SoundStartup();
@ -6734,7 +6735,7 @@ MAIN_LOOP_RESTART:
OSD_DispatchQueued();
char gameUpdate = false;
uint32_t gameUpdateStartTime = timerGetTicks();
double const gameUpdateStartTime = timerGetHiTicks();
if (((g_netClient || g_netServer) || (myplayer.gm & (MODE_MENU|MODE_DEMO)) == 0) && totalclock >= ototalclock+TICSPERFRAME)
{
if (g_networkMode != NET_DEDICATED_SERVER)
@ -6779,7 +6780,7 @@ MAIN_LOOP_RESTART:
while (((g_netClient || g_netServer) || (myplayer.gm & (MODE_MENU|MODE_DEMO)) == 0) && totalclock >= ototalclock+TICSPERFRAME);
gameUpdate = true;
g_gameUpdateTime = timerGetTicks()-gameUpdateStartTime;
g_gameUpdateTime = timerGetHiTicks()-gameUpdateStartTime;
if (g_gameUpdateAvgTime < 0.f)
g_gameUpdateAvgTime = g_gameUpdateTime;
g_gameUpdateAvgTime = ((GAMEUPDATEAVGTIMENUMSAMPLES-1.f)*g_gameUpdateAvgTime+g_gameUpdateTime)/((float) GAMEUPDATEAVGTIMENUMSAMPLES);
@ -6816,7 +6817,7 @@ MAIN_LOOP_RESTART:
if (gameUpdate)
{
g_gameUpdateAndDrawTime = timerGetTicks()-gameUpdateStartTime;
g_gameUpdateAndDrawTime = timerGetHiTicks()-gameUpdateStartTime;
}
}

View file

@ -338,7 +338,8 @@ extern int32_t MAXCACHE1DSIZE;
extern palette_t CrosshairColors;
extern palette_t DefaultCrosshairColors;
extern uint64_t g_frameDelay;
extern double g_frameDelay;
static inline double calcFrameDelay(int maxFPS) { return maxFPS ? ((double)timerGetFreqU64() / (double)(maxFPS)) : 0.0; }
int32_t A_CheckInventorySprite(spritetype *s);
int32_t A_InsertSprite(int16_t whatsect, int32_t s_x, int32_t s_y, int32_t s_z, int16_t s_pn, int8_t s_s, uint8_t s_xr,

View file

@ -90,7 +90,7 @@ int32_t g_gametypeFlags[MAXGAMETYPES] =
GAMETYPE_TDMSPAWN,
};
float g_gameUpdateAvgTime = -1.f;
double g_gameUpdateAvgTime = 0.001;
int32_t g_actorRespawnTime = 768;
int32_t g_bouncemineRadius = 2500;

View file

@ -160,10 +160,10 @@ G_EXTERN projectile_t SpriteProjectile[MAXSPRITES];
G_EXTERN sound_t g_sounds[MAXSOUNDS];
G_EXTERN uint32_t everyothertime;
G_EXTERN uint32_t g_moveThingsCount;
G_EXTERN uint32_t g_gameUpdateTime;
G_EXTERN uint32_t g_gameUpdateAndDrawTime;
G_EXTERN double g_gameUpdateTime;
G_EXTERN double g_gameUpdateAndDrawTime;
#define GAMEUPDATEAVGTIMENUMSAMPLES 100
extern float g_gameUpdateAvgTime;
extern double g_gameUpdateAvgTime;
#ifndef global_c_
extern char CheatKeys[2];

View file

@ -3220,9 +3220,7 @@ static int32_t Menu_EntryOptionModify(MenuEntry_t *entry, int32_t newOption)
}
}
else if (entry == &ME_VIDEOSETUP_FRAMELIMIT)
{
g_frameDelay = (newOption + r_maxfpsoffset) ? (timerGetFreqU64()/(newOption + r_maxfpsoffset)) : 0;
}
g_frameDelay = calcFrameDelay(newOption + r_maxfpsoffset);
switch (g_currentMenu)
{
@ -3330,7 +3328,7 @@ static int32_t Menu_EntryRangeInt32Modify(MenuEntry_t *entry, int32_t newValue)
else if (entry == &ME_JOYSTICKAXIS_SATU)
joySetDeadZone(M_JOYSTICKAXES.currentEntry, *MEO_JOYSTICKAXIS_DEAD.variable, newValue);
else if (entry == &ME_VIDEOSETUP_FRAMELIMITOFFSET)
g_frameDelay = (r_maxfps + newValue) ? (timerGetFreqU64()/(r_maxfps + newValue)) : 0;
g_frameDelay = calcFrameDelay(r_maxfps + newValue);
return 0;
}

View file

@ -1393,7 +1393,7 @@ static int osdcmd_cvar_set_game(osdcmdptr_t parm)
else if (!Bstrcasecmp(parm->name, "r_maxfps") || !Bstrcasecmp(parm->name, "r_maxfpsoffset"))
{
if (r_maxfps != 0) r_maxfps = clamp(r_maxfps, 30, 1000);
g_frameDelay = r_maxfps ? (timerGetFreqU64()/(r_maxfps + r_maxfpsoffset)) : 0;
g_frameDelay = calcFrameDelay(r_maxfps + r_maxfpsoffset);
}
else if (!Bstrcasecmp(parm->name, "r_ambientlight"))
{

View file

@ -773,7 +773,7 @@ static void G_ShowCacheLocks(void)
}
}
#define LOW_FPS 60
#define LOW_FPS ((videoGetRenderMode() == REND_CLASSIC) ? 35 : 50)
#define SLOW_FRAME_TIME 20
#if defined GEKKO
@ -786,12 +786,14 @@ static void G_ShowCacheLocks(void)
static void G_PrintFPS(void)
{
static int32_t frameCount = 0, lastFPS = 0, lastFrameTime = 0, cumulativeFrameDelay = 0;
static int32_t minFPS = -1, maxFPS = 0;
static uint32_t minGameUpdate = -1, maxGameUpdate = 0;
static int32_t frameCount;
static double cumulativeFrameDelay;
static double lastFrameTime;
static float lastFPS, minFPS = FLT_MAX, maxFPS;
static double minGameUpdate = DBL_MAX, maxGameUpdate;
int32_t frameTime = timerGetTicks();
int32_t frameDelay = frameTime - lastFrameTime;
double frameTime = timerGetHiTicks();
double frameDelay = frameTime - lastFrameTime;
cumulativeFrameDelay += frameDelay;
if (frameDelay >= 0)
@ -800,7 +802,7 @@ static void G_PrintFPS(void)
if (ud.showfps)
{
int32_t chars = Bsprintf(tempbuf, "%d ms (%3d fps)", frameDelay, lastFPS);
int32_t chars = Bsprintf(tempbuf, "%.1f ms, %5.1f fps", frameDelay, lastFPS);
printext256(windowxy2.x-(chars<<(3-x))+1, windowxy1.y+2+FPS_YOFFSET, 0, -1, tempbuf, x);
printext256(windowxy2.x-(chars<<(3-x)), windowxy1.y+1+FPS_YOFFSET,
@ -808,13 +810,13 @@ static void G_PrintFPS(void)
if (ud.showfps > 1)
{
chars = Bsprintf(tempbuf, "max fps: %3d", maxFPS);
chars = Bsprintf(tempbuf, "max: %5.1f fps", maxFPS);
printext256(windowxy2.x-(chars<<(3-x))+1, windowxy1.y+10+2+FPS_YOFFSET, 0, -1, tempbuf, x);
printext256(windowxy2.x-(chars<<(3-x)), windowxy1.y+10+FPS_YOFFSET,
FPS_COLOR(maxFPS < LOW_FPS), -1, tempbuf, x);
chars = Bsprintf(tempbuf, "min fps: %3d", minFPS);
chars = Bsprintf(tempbuf, "min: %5.1f fps", minFPS);
printext256(windowxy2.x-(chars<<(3-x))+1, windowxy1.y+20+2+FPS_YOFFSET, 0, -1, tempbuf, x);
printext256(windowxy2.x-(chars<<(3-x)), windowxy1.y+20+FPS_YOFFSET,
@ -825,13 +827,13 @@ static void G_PrintFPS(void)
if (g_gameUpdateTime > maxGameUpdate) maxGameUpdate = g_gameUpdateTime;
if (g_gameUpdateTime < minGameUpdate) minGameUpdate = g_gameUpdateTime;
chars = Bsprintf(tempbuf, "Game Update: %2u ms + draw: %2u ms", g_gameUpdateTime, g_gameUpdateAndDrawTime);
chars = Bsprintf(tempbuf, "Game Update: %2.2f ms + draw: %2.2f ms", g_gameUpdateTime, g_gameUpdateAndDrawTime);
printext256(windowxy2.x-(chars<<(3-x))+1, windowxy1.y+30+2+FPS_YOFFSET, 0, -1, tempbuf, x);
printext256(windowxy2.x-(chars<<(3-x)), windowxy1.y+30+FPS_YOFFSET,
FPS_COLOR(g_gameUpdateAndDrawTime >= SLOW_FRAME_TIME), -1, tempbuf, x);
chars = Bsprintf(tempbuf, "GU min/max/avg: %2u/%2u/%5.2f ms", minGameUpdate, maxGameUpdate, g_gameUpdateAvgTime);
chars = Bsprintf(tempbuf, "GU min/max/avg: %5.2f/%5.2f/%5.2f ms", minGameUpdate, maxGameUpdate, g_gameUpdateAvgTime);
printext256(windowxy2.x-(chars<<(3-x))+1, windowxy1.y+40+2+FPS_YOFFSET, 0, -1, tempbuf, x);
printext256(windowxy2.x-(chars<<(3-x)), windowxy1.y+40+FPS_YOFFSET,
@ -861,24 +863,26 @@ static void G_PrintFPS(void)
}
}
if (cumulativeFrameDelay >= 1000)
if (cumulativeFrameDelay >= 1000.0)
{
g_frameRate = lastFPS = tabledivide32_noinline(1000*frameCount, cumulativeFrameDelay);
lastFPS = 1000.f * frameCount / cumulativeFrameDelay;
g_frameRate = Blrintf(lastFPS);
frameCount = 0;
cumulativeFrameDelay = 0;
cumulativeFrameDelay = 0.0;
if (ud.showfps > 1)
{
if (lastFPS > maxFPS) maxFPS = lastFPS;
if ((unsigned) lastFPS < (unsigned) minFPS) minFPS = lastFPS;
if (lastFPS < minFPS) minFPS = lastFPS;
static int secondCounter;
if (++secondCounter == 3)
if (++secondCounter == 1)
{
maxFPS = (lastFPS + maxFPS) >> 1;
minFPS = (lastFPS + minFPS) >> 1;
maxGameUpdate = (g_gameUpdateTime + maxGameUpdate) >> 1;
minGameUpdate = (g_gameUpdateTime + minGameUpdate) >> 1;
maxFPS = (lastFPS + maxFPS) * .5f;
minFPS = (lastFPS + minFPS) * .5f;
maxGameUpdate = (g_gameUpdateTime + maxGameUpdate) * 0.5;
minGameUpdate = (g_gameUpdateTime + minGameUpdate) * 0.5;
secondCounter = 0;
}
}