Android: add FRAME_SKIPPING and FRAME_INTERPOLATION

This commit is contained in:
Pavel Barabanov 2025-04-10 22:24:15 +03:00 committed by xbzk
parent 5ba3ae32dc
commit f9f3fd0f3e
7 changed files with 41 additions and 6 deletions

View file

@ -89,11 +89,10 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting {
GPU_LOG_MEMORY_TRACKING("gpu_log_memory_tracking"), GPU_LOG_MEMORY_TRACKING("gpu_log_memory_tracking"),
GPU_LOG_DRIVER_DEBUG("gpu_log_driver_debug"), GPU_LOG_DRIVER_DEBUG("gpu_log_driver_debug"),
ENABLE_FRAME_INTERPOLATION("enable_frame_interpolation"),
ENABLE_FRAME_SKIPPING("enable_frame_skipping"),
ENABLE_QUICK_SETTINGS("enable_quick_settings"); ENABLE_QUICK_SETTINGS("enable_quick_settings");
// external fun isFrameSkippingEnabled(): Boolean
external fun isFrameInterpolationEnabled(): Boolean
override fun getBoolean(needsGlobal: Boolean): Boolean = override fun getBoolean(needsGlobal: Boolean): Boolean =
NativeConfig.getBoolean(key, needsGlobal) NativeConfig.getBoolean(key, needsGlobal)

View file

@ -238,6 +238,22 @@ abstract class SettingsItem(
override fun reset() = BooleanSetting.USE_DOCKED_MODE.reset() override fun reset() = BooleanSetting.USE_DOCKED_MODE.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( put(
SwitchSetting( SwitchSetting(
dockedModeSetting, dockedModeSetting,

View file

@ -271,6 +271,8 @@ class SettingsFragmentPresenter(
sl.apply { sl.apply {
// add(IntSetting.RENDERER_NVDEC_EMULATION.key) // add(IntSetting.RENDERER_NVDEC_EMULATION.key)
add(BooleanSetting.ENABLE_FRAME_INTERPOLATION.key)
add(BooleanSetting.ENABLE_FRAME_SKIPPING.key)
add(IntSetting.RENDERER_RESOLUTION.key) add(IntSetting.RENDERER_RESOLUTION.key)
add(IntSetting.RENDERER_VSYNC.key) add(IntSetting.RENDERER_VSYNC.key)
add(IntSetting.RENDERER_SCALING_FILTER.key) add(IntSetting.RENDERER_SCALING_FILTER.key)

View file

@ -1509,6 +1509,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
if (BooleanSetting.SHOW_FPS.getBoolean(needsGlobal)) { if (BooleanSetting.SHOW_FPS.getBoolean(needsGlobal)) {
var fpsText = String.format("FPS: %.1f", actualFps) var fpsText = String.format("FPS: %.1f", actualFps)
if (BooleanSetting.ENABLE_FRAME_INTERPOLATION.getBoolean(needsGlobal)) {
fpsText += String.format(" (Generated: %.1f)", actualFps * 2)
}
sb.append(fpsText) sb.append(fpsText)
} }

View file

@ -465,6 +465,10 @@
<string name="network">Network</string> <string name="network">Network</string>
<!-- Graphics settings strings --> <!-- 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_resolution">Resolution (Handheld/Docked)</string> <string name="renderer_resolution">Resolution (Handheld/Docked)</string>
<string name="renderer_vsync">VSync mode</string> <string name="renderer_vsync">VSync mode</string>
<string name="renderer_scaling_filter">Window adapting filter</string> <string name="renderer_scaling_filter">Window adapting filter</string>

View file

@ -337,6 +337,10 @@ struct Values {
#endif #endif
"backend", Category::Renderer}; "backend", Category::Renderer};
SwitchableSetting<int> vulkan_device{linkage, 0, "vulkan_device", Category::Renderer, Specialization::RuntimeList}; SwitchableSetting<int> vulkan_device{linkage, 0, "vulkan_device", Category::Renderer, Specialization::RuntimeList};
SwitchableSetting<bool> enable_frame_interpolation{linkage, true, "enable_frame_interpolation",
Category::Renderer};
SwitchableSetting<bool> enable_frame_skipping{linkage, true, "enable_frame_skipping",
Category::Renderer};
// Graphics Settings // Graphics Settings
ResolutionScalingInfo resolution_info{}; ResolutionScalingInfo resolution_info{};

View file

@ -38,9 +38,6 @@
#include "video_core/vulkan_common/vulkan_memory_allocator.h" #include "video_core/vulkan_common/vulkan_memory_allocator.h"
#include "video_core/vulkan_common/vulkan_surface.h" #include "video_core/vulkan_common/vulkan_surface.h"
#include "video_core/vulkan_common/vulkan_wrapper.h" #include "video_core/vulkan_common/vulkan_wrapper.h"
#ifdef __ANDROID__
#include <jni.h>
#endif
namespace Vulkan { namespace Vulkan {
namespace { namespace {
@ -175,6 +172,16 @@ RendererVulkan::~RendererVulkan() {
} }
void RendererVulkan::Composite(std::span<const Tegra::FramebufferConfig> framebuffers) { void RendererVulkan::Composite(std::span<const Tegra::FramebufferConfig> framebuffers) {
#ifdef __ANDROID__
static u64 frame_counter = 0;
if (Settings::values.enable_frame_skipping.GetValue()) {
++frame_counter;
if ((frame_counter % 2) != 0) {
return;
}
}
#endif
SCOPE_EXIT { SCOPE_EXIT {
render_window.OnFrameDisplayed(); render_window.OnFrameDisplayed();
}; };