Add com_waitEndFrameMode
This commit is contained in:
parent
820aa6788e
commit
1c1a543a9c
@ -16,9 +16,12 @@ namespace fps
|
|||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
utils::hook::detour sub_5D6810_hook;
|
utils::hook::detour sub_5D6810_hook;
|
||||||
|
utils::hook::detour com_frame_hook;
|
||||||
|
utils::hook::detour r_wait_end_time_hook;
|
||||||
|
|
||||||
game::dvar_t* cg_drawfps;
|
game::dvar_t* cg_drawfps = nullptr;
|
||||||
game::dvar_t* cg_drawping;
|
game::dvar_t* cg_drawping = nullptr;
|
||||||
|
game::dvar_t* com_wait_end_frame_mode = nullptr;
|
||||||
|
|
||||||
float fps_color_good[4] = {0.6f, 1.0f, 0.0f, 1.0f};
|
float fps_color_good[4] = {0.6f, 1.0f, 0.0f, 1.0f};
|
||||||
float fps_color_ok[4] = {1.0f, 0.7f, 0.3f, 1.0f};
|
float fps_color_ok[4] = {1.0f, 0.7f, 0.3f, 1.0f};
|
||||||
@ -128,17 +131,74 @@ namespace fps
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
game::dvar_t* cg_draw_fps_register_stub()
|
|
||||||
{
|
|
||||||
cg_drawfps = dvars::register_int("cg_drawFps", 0, 0, 2, game::DVAR_FLAG_SAVED, "Draw frames per second");
|
|
||||||
return cg_drawfps;
|
|
||||||
}
|
|
||||||
|
|
||||||
void sub_5D6810_stub()
|
void sub_5D6810_stub()
|
||||||
{
|
{
|
||||||
perf_update();
|
perf_update();
|
||||||
sub_5D6810_hook.invoke<void>();
|
sub_5D6810_hook.invoke<void>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool r_wait_end_frame_stub()
|
||||||
|
{
|
||||||
|
if (com_wait_end_frame_mode->current.integer > 0)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return r_wait_end_time_hook.invoke<bool>();
|
||||||
|
}
|
||||||
|
|
||||||
|
void com_frame_stub()
|
||||||
|
{
|
||||||
|
const auto value = com_wait_end_frame_mode->current.integer;
|
||||||
|
if (value == 0)
|
||||||
|
{
|
||||||
|
return com_frame_hook.invoke<void>();
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto start = std::chrono::high_resolution_clock::now();
|
||||||
|
com_frame_hook.invoke<void>();
|
||||||
|
|
||||||
|
auto max_fps = 0;
|
||||||
|
static const auto com_max_fps = game::Dvar_FindVar("com_maxfps");
|
||||||
|
|
||||||
|
if (game::environment::is_mp())
|
||||||
|
{
|
||||||
|
max_fps = utils::hook::invoke<int>(0x183490_b, com_max_fps);
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
max_fps = com_max_fps->current.integer;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (max_fps == 0)
|
||||||
|
{
|
||||||
|
max_fps = 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
constexpr auto nano_secs = std::chrono::duration_cast<std::chrono::nanoseconds>(1s);
|
||||||
|
const auto frame_time = nano_secs / max_fps;
|
||||||
|
|
||||||
|
if (value == 1)
|
||||||
|
{
|
||||||
|
const auto diff = (std::chrono::high_resolution_clock::now() - start);
|
||||||
|
if (diff > frame_time)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(frame_time - diff);
|
||||||
|
std::this_thread::sleep_for(ms);
|
||||||
|
}
|
||||||
|
else if (value == 2)
|
||||||
|
{
|
||||||
|
while (std::chrono::high_resolution_clock::now() - start < frame_time)
|
||||||
|
{
|
||||||
|
std::this_thread::sleep_for(0ms);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int get_fps()
|
int get_fps()
|
||||||
@ -204,6 +264,11 @@ namespace fps
|
|||||||
|
|
||||||
dvars::register_bool("cg_infobar_fps", false, game::DVAR_FLAG_SAVED, "Show server latency");
|
dvars::register_bool("cg_infobar_fps", false, game::DVAR_FLAG_SAVED, "Show server latency");
|
||||||
dvars::register_bool("cg_infobar_ping", false, game::DVAR_FLAG_SAVED, "Show FPS counter");
|
dvars::register_bool("cg_infobar_ping", false, game::DVAR_FLAG_SAVED, "Show FPS counter");
|
||||||
|
|
||||||
|
// Make fps capping accurate
|
||||||
|
com_wait_end_frame_mode = dvars::register_int("com_waitEndFrameMode", 0, 0, 2, game::DVAR_FLAG_SAVED, "Wait end frame mode (0 = default, 1 = sleep(n), 2 = loop sleep(0)");
|
||||||
|
r_wait_end_time_hook.create(SELECT_VALUE(0x3A7330_b, 0x1C2420_b), r_wait_end_frame_stub);
|
||||||
|
com_frame_hook.create(SELECT_VALUE(0x385210_b, 0x15A960_b), com_frame_stub);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user