uint64_t based FPS limiter

git-svn-id: https://svn.eduke32.com/eduke32@6441 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
terminx 2017-09-19 19:10:39 +00:00
parent 60d06d8757
commit 389c71e185
4 changed files with 11 additions and 10 deletions

View file

@ -120,7 +120,7 @@ int32_t hud_showmapname = 1;
int32_t g_levelTextTime = 0;
int32_t r_maxfps = 60;
uint32_t g_frameDelay = 17;
uint64_t g_frameDelay = 17;
#if defined(RENDERTYPEWIN) && defined(USE_OPENGL)
extern char forcegl;
@ -6077,7 +6077,8 @@ void G_MaybeAllocPlayer(int32_t pnum)
int G_FPSLimit(void)
{
static uint32_t nextRender = 0, frameWaiting = 0;
static uint64_t nextPageTicks = 0;
static int frameWaiting = 0;
if (frameWaiting)
{
@ -6085,14 +6086,14 @@ int G_FPSLimit(void)
nextpage();
}
uint32_t frameTime = getticks();
uint64_t const frameTicks = getu64ticks();
if (r_maxfps == 0 || frameTime >= nextRender)
if (r_maxfps == 0 || frameTicks >= nextPageTicks)
{
if (frameTime > nextRender + g_frameDelay)
nextRender = frameTime;
if (frameTicks >= nextPageTicks + g_frameDelay)
nextPageTicks = frameTicks;
nextRender += g_frameDelay;
nextPageTicks += g_frameDelay;
frameWaiting++;
return 1;

View file

@ -290,7 +290,7 @@ extern int32_t MAXCACHE1DSIZE;
extern palette_t CrosshairColors;
extern palette_t DefaultCrosshairColors;
extern uint32_t g_frameDelay;
extern uint64_t g_frameDelay;
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

@ -2945,7 +2945,7 @@ static int32_t Menu_EntryOptionModify(MenuEntry_t *entry, int32_t newOption)
}
else if (entry == &ME_VIDEOSETUP_FRAMELIMIT)
{
g_frameDelay = newOption ? Blrintf(1000.f/(float) newOption) : 0;
g_frameDelay = newOption ? (getu64tickspersec()/newOption) : 0;
}
switch (g_currentMenu)

View file

@ -1424,7 +1424,7 @@ static int32_t osdcmd_cvar_set_game(osdfuncparm_t const * const parm)
else if (!Bstrcasecmp(parm->name, "r_maxfps"))
{
if (r_maxfps != 0) r_maxfps = clamp(r_maxfps, 30, 1000);
g_frameDelay = r_maxfps ? Blrintf(1000.f/(float)r_maxfps) : 0;
g_frameDelay = r_maxfps ? (getu64tickspersec()/r_maxfps) : 0;
}
else if (!Bstrcasecmp(parm->name, "r_ambientlight"))
{