Android: add FRAME_SKIPPING and FRAME_INTERPOLATION

This commit is contained in:
Pavel Barabanov 2025-04-10 22:24:15 +03:00 committed by MrPurple666
parent f9f311c014
commit d25bea5762
8 changed files with 155 additions and 6 deletions

View file

@ -26,7 +26,13 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting {
SHOW_PERFORMANCE_OVERLAY("show_performance_overlay"),
SHOW_INPUT_OVERLAY("show_input_overlay"),
TOUCHSCREEN("touchscreen"),
SHOW_THERMAL_OVERLAY("show_thermal_overlay");
SHOW_THERMAL_OVERLAY("show_thermal_overlay"),
ENABLE_FRAME_INTERPOLATION("enable_frame_interpolation"),
ENABLE_FRAME_SKIPPING("enable_frame_skipping"),
CORE_USE_MULTI_CORE("use_multi_core");
external fun isFrameSkippingEnabled(): Boolean
external fun isFrameInterpolationEnabled(): Boolean
override fun getBoolean(needsGlobal: Boolean): Boolean =
NativeConfig.getBoolean(key, needsGlobal)

View file

@ -172,6 +172,56 @@ abstract class SettingsItem(
override fun reset() = BooleanSetting.USE_DOCKED_MODE.reset()
}
val enableInterpolationSetting = object : AbstractBooleanSetting {
override val key = BooleanSetting.ENABLE_FRAME_INTERPOLATION.key
override fun getBoolean(needsGlobal: Boolean): Boolean =
BooleanSetting.ENABLE_FRAME_INTERPOLATION.getBoolean(needsGlobal)
override fun setBoolean(value: Boolean) =
BooleanSetting.ENABLE_FRAME_INTERPOLATION.setBoolean(value)
override val defaultValue = BooleanSetting.ENABLE_FRAME_INTERPOLATION.defaultValue
override fun getValueAsString(needsGlobal: Boolean): String =
BooleanSetting.ENABLE_FRAME_INTERPOLATION.getValueAsString(needsGlobal)
override fun reset() = BooleanSetting.ENABLE_FRAME_INTERPOLATION.reset()
}
val enableFrameSkippingSetting = object : AbstractBooleanSetting {
override val key = BooleanSetting.ENABLE_FRAME_SKIPPING.key
override fun getBoolean(needsGlobal: Boolean): Boolean =
BooleanSetting.ENABLE_FRAME_SKIPPING.getBoolean(needsGlobal)
override fun setBoolean(value: Boolean) =
BooleanSetting.ENABLE_FRAME_SKIPPING.setBoolean(value)
override val defaultValue = BooleanSetting.ENABLE_FRAME_SKIPPING.defaultValue
override fun getValueAsString(needsGlobal: Boolean): String =
BooleanSetting.ENABLE_FRAME_SKIPPING.getValueAsString(needsGlobal)
override fun reset() = BooleanSetting.ENABLE_FRAME_SKIPPING.reset()
}
put(
SwitchSetting(
BooleanSetting.ENABLE_FRAME_INTERPOLATION,
titleId = R.string.enable_frame_interpolation,
descriptionId = R.string.enable_frame_interpolation_description
)
)
put(
SwitchSetting(
BooleanSetting.ENABLE_FRAME_SKIPPING,
titleId = R.string.enable_frame_skipping,
descriptionId = R.string.enable_frame_skipping_description
)
)
put(
SwitchSetting(
dockedModeSetting,

View file

@ -169,6 +169,8 @@ class SettingsFragmentPresenter(
private fun addGraphicsSettings(sl: ArrayList<SettingsItem>) {
sl.apply {
add(BooleanSetting.ENABLE_FRAME_INTERPOLATION.key)
add(BooleanSetting.ENABLE_FRAME_SKIPPING.key)
add(IntSetting.RENDERER_ACCURACY.key)
add(IntSetting.RENDERER_RESOLUTION.key)
add(IntSetting.RENDERER_VSYNC.key)

View file

@ -534,10 +534,18 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
// Calculate used memory
val usedMegs = (mi.totalMem - mi.availMem) / 1048576L // Convert bytes to megabytes
val actualFps = perfStats[FPS]
val enableFrameInterpolation = BooleanSetting.ENABLE_FRAME_INTERPOLATION.getBoolean()
val generatedFpsText = if (enableFrameInterpolation) {
val generatedFps = actualFps * 2
String.format("(Generated: %.1f)", generatedFps)
} else {
""
}
if (_binding != null) {
binding.showFpsText.text = String.format(
"%.1f FPS • %d MB • %s/%s",
perfStats[FPS], usedMegs, cpuBackend, gpuDriver
"%.1f %s FPS • %d MB • %s/%s",
actualFps, generatedFpsText, usedMegs, cpuBackend, gpuDriver
)
}
perfStatsUpdateHandler.postDelayed(perfStatsUpdater!!, 800)

View file

@ -230,6 +230,10 @@
<string name="set_custom_rtc">Set custom RTC</string>
<!-- Graphics settings strings -->
<string name="enable_frame_skipping">Enable Frame Skipping</string>
<string name="enable_frame_skipping_description">Toggle frame skipping to improve performance by reducing the number of rendered frames.</string>
<string name="enable_frame_interpolation">Enable Frame Interpolation</string>
<string name="enable_frame_interpolation_description">Toggle frame interpolation to improve visual smoothness by generating intermediate frames.</string>
<string name="renderer_accuracy">Accuracy level</string>
<string name="renderer_resolution">Resolution (Handheld/Docked)</string>
<string name="renderer_vsync">VSync mode</string>