From 72e9e2af95e40ebf87183b52720c2ecb41c71eb2 Mon Sep 17 00:00:00 2001 From: fgsfds Date: Tue, 14 Nov 2023 23:29:44 +0100 Subject: [PATCH] port: very experimental uncapped framerate support set Game.TickRateDivisor in pd.ini to 0 this still has many issues, such as combat boost not working --- port/src/main.c | 3 +++ port/src/pdmain.c | 2 +- src/game/timing.c | 6 +++++- src/include/data.h | 1 + src/lib/varsinit.c | 4 ++++ 5 files changed, 14 insertions(+), 2 deletions(-) diff --git a/port/src/main.c b/port/src/main.c index 7e6d059f4..d13024b08 100644 --- a/port/src/main.c +++ b/port/src/main.c @@ -35,6 +35,8 @@ u32 g_VmNumPageMisses = 0; u32 g_VmNumPageReplaces = 0; u8 g_VmShowStats = 0; +s32 g_TickRateDiv = 1; + extern s32 g_StageNum; s32 bootGetMemSize(void) @@ -135,6 +137,7 @@ PD_CONSTRUCTOR static void gameConfigInit(void) configRegisterInt("Game.MemorySize", &g_OsMemSizeMb, 4, 2048); configRegisterInt("Game.CenterHUD", &g_HudCenter, 0, 1); configRegisterFloat("Game.ScreenShakeIntensity", &g_ViShakeIntensityMult, 0.f, 10.f); + configRegisterInt("Game.TickRateDivisor", &g_TickRateDiv, 0, 10); for (s32 j = 0; j < MAX_PLAYERS; ++j) { const s32 i = j + 1; configRegisterFloat(strFmt("Game.Player%d.FovY", i), &g_PlayerExtCfg[j].fovy, 5.f, 175.f); diff --git a/port/src/pdmain.c b/port/src/pdmain.c index 9ccb3f70a..77c031800 100644 --- a/port/src/pdmain.c +++ b/port/src/pdmain.c @@ -494,7 +494,7 @@ void mainLoop(void) while (g_MainChangeToStageNum < 0) { const s32 cycles = osGetCount() - g_Vars.thisframestartt; - if (cycles >= g_Vars.mininc60 * CYCLES_PER_FRAME - CYCLES_PER_FRAME / 2) { + if (!g_Vars.mininc60 || (cycles >= g_Vars.mininc60 * CYCLES_PER_FRAME - CYCLES_PER_FRAME / 2)) { schedStartFrame(&g_Sched); mainTick(); schedEndFrame(&g_Sched); diff --git a/src/game/timing.c b/src/game/timing.c index 3739af362..9a7c8e380 100644 --- a/src/game/timing.c +++ b/src/game/timing.c @@ -41,12 +41,16 @@ void frametimeCalculate(void) diffframe60 = (g_Vars.lostframetime60t + diffframet + CYCLES_PER_FRAME / 2) / CYCLES_PER_FRAME; diffframe240 = (g_Vars.lostframetime240t + diffframet + CYCLES_PER_FRAME / 2 / 4) / (CYCLES_PER_FRAME / 4); - } while (diffframe60 < g_Vars.mininc60); + } while (g_Vars.mininc60 && diffframe60 < g_Vars.mininc60); g_Vars.lostframetime60t = g_Vars.lostframetime60t + diffframet - diffframe60 * CYCLES_PER_FRAME; g_Vars.lostframetime240t = g_Vars.lostframetime240t + diffframet - diffframe240 * (CYCLES_PER_FRAME / 4); +#ifdef PLATFORM_N64 g_Vars.mininc60 = 1; +#else + g_Vars.mininc60 = g_TickRateDiv; +#endif frametimeApply(diffframe60, diffframe240, count); } diff --git a/src/include/data.h b/src/include/data.h index 5a897577d..e94aaa7c5 100644 --- a/src/include/data.h +++ b/src/include/data.h @@ -545,6 +545,7 @@ extern u32 g_HudAlignModeR; extern s32 g_PrevFrameFb; extern s32 g_BlurFb; extern s32 g_BlurFbCapTimer; +extern s32 g_TickRateDiv; #define PLAYER_EXTCFG() g_PlayerExtCfg[g_Vars.currentplayerstats->mpindex & 3] #define PLAYER_DEFAULT_FOV (PLAYER_EXTCFG().fovy) diff --git a/src/lib/varsinit.c b/src/lib/varsinit.c index 0d7925fe7..c64418044 100644 --- a/src/lib/varsinit.c +++ b/src/lib/varsinit.c @@ -28,7 +28,11 @@ void varsInit(void) g_Vars.lostframetime60t = 0; g_Vars.lostframetime240t = 0; g_Vars.lvupdate240rem = 2; +#ifdef PLATFORM_N64 g_Vars.mininc60 = 1; +#else + g_Vars.mininc60 = g_TickRateDiv; +#endif g_Vars.roomportalrecursionlimit = 254; g_Vars.diffframe240f = 4; g_Vars.diffframe240freal = 4;