mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-09-12 06:39:26 +00:00
Some sanitize changes on latency
This commit is contained in:
@@ -124,9 +124,18 @@ float EmuWindow_Android::GetFrameTimeVerifiedHint() const {
|
|||||||
return QuantizeFrameRateHint(verified_rate);
|
return QuantizeFrameRateHint(verified_rate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float EmuWindow_Android::GetPresentedFrameMultiplier() {
|
||||||
|
if (!Settings::values.frame_gen.GetValue()) {
|
||||||
|
return 1.0f;
|
||||||
|
}
|
||||||
|
return static_cast<float>(std::clamp<u32>(Settings::values.frame_gen_multiplier.GetValue(), 2, 4));
|
||||||
|
}
|
||||||
|
|
||||||
float EmuWindow_Android::GetFrameRateHint() const {
|
float EmuWindow_Android::GetFrameRateHint() const {
|
||||||
const float observed_rate = std::clamp(m_smoothed_present_rate, 0.0f, 240.0f);
|
const float presented_multiplier = GetPresentedFrameMultiplier();
|
||||||
const float frame_time_verified_hint = GetFrameTimeVerifiedHint();
|
const float observed_rate =
|
||||||
|
std::clamp(m_smoothed_present_rate * presented_multiplier, 0.0f, 240.0f);
|
||||||
|
const float frame_time_verified_hint = GetFrameTimeVerifiedHint() * presented_multiplier;
|
||||||
|
|
||||||
if (m_last_frame_rate_hint > 0.0f && observed_rate > 0.0f) {
|
if (m_last_frame_rate_hint > 0.0f && observed_rate > 0.0f) {
|
||||||
const float tolerance = std::max(m_last_frame_rate_hint * 0.12f, 4.0f);
|
const float tolerance = std::max(m_last_frame_rate_hint * 0.12f, 4.0f);
|
||||||
@@ -150,9 +159,9 @@ float EmuWindow_Android::GetFrameRateHint() const {
|
|||||||
return frame_time_verified_hint;
|
return frame_time_verified_hint;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr float NominalFrameRate = 60.0f;
|
const float nominal_rate = 60.0f * presented_multiplier;
|
||||||
if (!Settings::values.use_speed_limit.GetValue()) {
|
if (!Settings::values.use_speed_limit.GetValue()) {
|
||||||
return NominalFrameRate;
|
return QuantizeFrameRateHint(nominal_rate);
|
||||||
}
|
}
|
||||||
|
|
||||||
const u16 speed_limit = Settings::SpeedLimit();
|
const u16 speed_limit = Settings::SpeedLimit();
|
||||||
@@ -161,7 +170,7 @@ float EmuWindow_Android::GetFrameRateHint() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const float speed_limited_rate =
|
const float speed_limited_rate =
|
||||||
NominalFrameRate * (static_cast<float>(std::min<u16>(speed_limit, 100)) / 100.0f);
|
nominal_rate * (static_cast<float>(std::min<u16>(speed_limit, 100)) / 100.0f);
|
||||||
return QuantizeFrameRateHint(speed_limited_rate);
|
return QuantizeFrameRateHint(speed_limited_rate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ private:
|
|||||||
void UpdateObservedFrameRate();
|
void UpdateObservedFrameRate();
|
||||||
[[nodiscard]] float GetFrameRateHint() const;
|
[[nodiscard]] float GetFrameRateHint() const;
|
||||||
[[nodiscard]] float GetFrameTimeVerifiedHint() const;
|
[[nodiscard]] float GetFrameTimeVerifiedHint() const;
|
||||||
|
[[nodiscard]] static float GetPresentedFrameMultiplier();
|
||||||
[[nodiscard]] static float QuantizeFrameRateHint(float frame_rate);
|
[[nodiscard]] static float QuantizeFrameRateHint(float frame_rate);
|
||||||
|
|
||||||
float m_window_width{};
|
float m_window_width{};
|
||||||
|
|||||||
@@ -299,7 +299,7 @@
|
|||||||
<string name="gpu_driver_manager">GPU driver manager</string>
|
<string name="gpu_driver_manager">GPU driver manager</string>
|
||||||
<string name="install_gpu_driver_description">Install alternative drivers for potentially better performance or accuracy</string>
|
<string name="install_gpu_driver_description">Install alternative drivers for potentially better performance or accuracy</string>
|
||||||
<string name="frame_gen">Frame generation</string>
|
<string name="frame_gen">Frame generation</string>
|
||||||
<string name="frame_gen_description">Run the Lossless Scaling interpolation shaders on every frame. Incomplete: the interpolated frame is computed but not yet displayed, so this only costs performance for now.</string>
|
<string name="frame_gen_description">Insert interpolated frames between rendered ones using Lossless Scaling. Forces FIFO presentation while enabled, since other modes discard the generated frames. Adds about one frame of latency.</string>
|
||||||
<string name="frame_gen_multiplier">Frame multiplier</string>
|
<string name="frame_gen_multiplier">Frame multiplier</string>
|
||||||
<string name="frame_gen_multiplier_description">How many frames to display for each rendered frame. Higher values cost proportionally more GPU time.</string>
|
<string name="frame_gen_multiplier_description">How many frames to display for each rendered frame. Higher values cost proportionally more GPU time.</string>
|
||||||
<string name="frame_gen_multiplier_2x">2x (one generated frame)</string>
|
<string name="frame_gen_multiplier_2x">2x (one generated frame)</string>
|
||||||
|
|||||||
@@ -146,9 +146,10 @@ public:
|
|||||||
frame_counter++;
|
frame_counter++;
|
||||||
auto target_time = start_time + frame_interval * frame_counter;
|
auto target_time = start_time + frame_interval * frame_counter;
|
||||||
if (target_time >= now) {
|
if (target_time >= now) {
|
||||||
|
constexpr auto spin_tail = std::chrono::milliseconds(1);
|
||||||
auto sleep_time = target_time - now;
|
auto sleep_time = target_time - now;
|
||||||
if (sleep_time > std::chrono::milliseconds(15)) {
|
if (sleep_time > spin_tail * 2) {
|
||||||
std::this_thread::sleep_for(sleep_time - std::chrono::milliseconds(1));
|
std::this_thread::sleep_for(sleep_time - spin_tail);
|
||||||
}
|
}
|
||||||
while (std::chrono::steady_clock::now() < target_time) {
|
while (std::chrono::steady_clock::now() < target_time) {
|
||||||
std::this_thread::yield();
|
std::this_thread::yield();
|
||||||
|
|||||||
@@ -48,6 +48,9 @@ static VkPresentModeKHR ChooseSwapPresentMode(bool has_imm, bool has_mailbox,
|
|||||||
Settings::VSyncMode setting = [has_imm, has_mailbox]() {
|
Settings::VSyncMode setting = [has_imm, has_mailbox]() {
|
||||||
// Choose Mailbox or Immediate if unlocked and those modes are supported
|
// Choose Mailbox or Immediate if unlocked and those modes are supported
|
||||||
const auto mode = Settings::values.vsync_mode.GetValue();
|
const auto mode = Settings::values.vsync_mode.GetValue();
|
||||||
|
if (Settings::values.frame_gen.GetValue()) {
|
||||||
|
return mode == Settings::VSyncMode::FifoRelaxed ? mode : Settings::VSyncMode::Fifo;
|
||||||
|
}
|
||||||
if (Settings::values.use_speed_limit.GetValue() &&
|
if (Settings::values.use_speed_limit.GetValue() &&
|
||||||
Settings::values.current_speed_mode.GetValue() != Settings::SpeedMode::Turbo) {
|
Settings::values.current_speed_mode.GetValue() != Settings::SpeedMode::Turbo) {
|
||||||
return mode;
|
return mode;
|
||||||
|
|||||||
Reference in New Issue
Block a user