mirror of
https://github.com/RPCSX/rpcsx.git
synced 2026-04-04 14:08:37 +00:00
rsx: Improve frame-limiter (#7723)
* rsx: Improve frame-limiter accuracy * lv2: Improve lv2_obj::wait_timeout response time for aborting threads * rsx: Make stretch to display area setting dynamic * rsx: Redefine 'auto' frame limiter to obey vblank rate * rsx: Make frame limiter setting dynamic * rsx: Make frame-limiter compatible with dynamic changes
This commit is contained in:
parent
deb6bd3e25
commit
892f74d762
5 changed files with 29 additions and 22 deletions
|
|
@ -2654,33 +2654,38 @@ namespace rsx
|
|||
case frame_limit_type::_50: limit = 50.; break;
|
||||
case frame_limit_type::_60: limit = 60.; break;
|
||||
case frame_limit_type::_30: limit = 30.; break;
|
||||
case frame_limit_type::_auto: limit = fps_limit; break; // TODO
|
||||
case frame_limit_type::_auto: limit = g_cfg.video.vblank_rate; break; // TODO
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (limit)
|
||||
{
|
||||
const u64 time = get_system_time() - Emu.GetPauseTime() - start_rsx_time;
|
||||
const u64 time = get_system_time() - Emu.GetPauseTime();
|
||||
const u64 needed_us = static_cast<u64>(1000000 / limit);
|
||||
|
||||
if (int_flip_index == 0)
|
||||
{
|
||||
start_rsx_time = time;
|
||||
target_rsx_flip_time = time;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Convert limit to expected time value
|
||||
double expected = int_flip_index * 1000000. / limit;
|
||||
|
||||
while (time >= expected + 1000000. / limit)
|
||||
do
|
||||
{
|
||||
expected = int_flip_index++ * 1000000. / limit;
|
||||
target_rsx_flip_time += needed_us;
|
||||
}
|
||||
while (time >= target_rsx_flip_time + needed_us);
|
||||
|
||||
if (expected > time + 1000)
|
||||
if (target_rsx_flip_time > time + 1000)
|
||||
{
|
||||
const auto delay_us = static_cast<s64>(expected - time);
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds{ delay_us / 1000 });
|
||||
const auto delay_us = target_rsx_flip_time - time;
|
||||
lv2_obj::wait_timeout<false, false>(delay_us);
|
||||
|
||||
if (thread_ctrl::state() == thread_state::aborting)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
performance_counters.idle_time += delay_us;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue