diff --git a/app/src/main/cpp/libretro_frontend.cpp b/app/src/main/cpp/libretro_frontend.cpp index 0867adb..cced118 100644 --- a/app/src/main/cpp/libretro_frontend.cpp +++ b/app/src/main/cpp/libretro_frontend.cpp @@ -86,6 +86,7 @@ std::string rom_runtime_path; std::string rom_runtime_directory; bool core_initialized = false; bool game_loaded = false; +bool frame_rate_enhancement_enabled = false; std::atomic shutdown_requested{false}; void core_log(unsigned level, const char *message) { @@ -124,8 +125,21 @@ bool environment(unsigned command, void *data) { case ENV_GET_VARIABLE_UPDATE: if (data != nullptr) *static_cast(data) = false; return true; - case ENV_GET_VARIABLE: + case ENV_GET_VARIABLE: { + if (data == nullptr) return false; + auto *variable = static_cast(data); + if (variable->key == nullptr) return false; + if (std::strcmp( + variable->key, + "dingooemu_frame_rate_enhancement" + ) == 0) { + variable->value = frame_rate_enhancement_enabled + ? "enabled" + : "disabled"; + return true; + } return false; + } case ENV_GET_LOG_INTERFACE: if (data == nullptr) return false; static_cast(data)->log = core_log; @@ -274,6 +288,7 @@ void shutdown_core() { release_rom_runtime_file(); input_mask.store(0, std::memory_order_relaxed); shutdown_requested.store(false, std::memory_order_relaxed); + frame_rate_enhancement_enabled = false; } } // namespace @@ -284,10 +299,12 @@ Java_io_github_uplush_dingoobox_NativeBridge_nativeInitialize( jobject, jbyteArray rom_data_value, jstring rom_name_value, - jstring save_directory_value + jstring save_directory_value, + jboolean frame_rate_enhancement_value ) { std::lock_guard lock(core_mutex); shutdown_core(); + frame_rate_enhancement_enabled = frame_rate_enhancement_value == JNI_TRUE; if (rom_data_value == nullptr) return JNI_FALSE; const std::string rom_name = from_jstring(env, rom_name_value); diff --git a/app/src/main/java/io/github/uplush/dingoobox/AppPreferences.kt b/app/src/main/java/io/github/uplush/dingoobox/AppPreferences.kt index 8f700a0..460f0ac 100644 --- a/app/src/main/java/io/github/uplush/dingoobox/AppPreferences.kt +++ b/app/src/main/java/io/github/uplush/dingoobox/AppPreferences.kt @@ -47,6 +47,7 @@ data class AppSettingsState( val volumePercent: Int = 100, val soundSofteningEnabled: Boolean = false, val soundSofteningPercent: Int = 60, + val frameRateEnhancementEnabled: Boolean = false, val autoSaveEnabled: Boolean = false, val fastForwardMultiplier: Int = 2, val virtualControlsVisible: Boolean = true, @@ -87,6 +88,10 @@ class AppPreferences(context: Context) { soundSofteningPercent = preferences .getInt("sound_softening_level_percent", 60) .coerceIn(5, 95), + frameRateEnhancementEnabled = preferences.getBoolean( + "frame_rate_enhancement_enabled", + false + ), autoSaveEnabled = preferences.getBoolean("auto_save_state_enabled", false), fastForwardMultiplier = normalizeFastForwardMultiplier( preferences.getInt("fast_forward_multiplier", 2) @@ -114,6 +119,10 @@ class AppPreferences(context: Context) { "sound_softening_level_percent", settings.soundSofteningPercent.coerceIn(5, 95) ) + putBoolean( + "frame_rate_enhancement_enabled", + settings.frameRateEnhancementEnabled + ) putBoolean("auto_save_state_enabled", settings.autoSaveEnabled) putInt( "fast_forward_multiplier", @@ -300,7 +309,7 @@ class AppPreferences(context: Context) { companion object { private const val SETTINGS_SCHEMA_VERSION_KEY = "dingoo_settings_schema_version" - private const val SETTINGS_SCHEMA_VERSION = 22 + private const val SETTINGS_SCHEMA_VERSION = 23 private fun normalizeFastForwardMultiplier(value: Int): Int = when (value) { 0, 2, 3, 4 -> value diff --git a/app/src/main/java/io/github/uplush/dingoobox/EmulationScreen.kt b/app/src/main/java/io/github/uplush/dingoobox/EmulationScreen.kt index 3d56125..bc1f6e0 100644 --- a/app/src/main/java/io/github/uplush/dingoobox/EmulationScreen.kt +++ b/app/src/main/java/io/github/uplush/dingoobox/EmulationScreen.kt @@ -100,6 +100,7 @@ fun EmulationScreen( romData = repository.readGame(game).getOrNull(), romName = game.fileName, saveDirectory = repository.savesDirectory, + frameRateEnhancementEnabled = settings.frameRateEnhancementEnabled, bitmap = bitmap, view = bitmapView, onCoreShutdown = { @@ -1031,6 +1032,7 @@ private class EmulationSession( romData: ByteArray?, romName: String, saveDirectory: File, + frameRateEnhancementEnabled: Boolean, private val bitmap: Bitmap, private val view: View, private val onCoreShutdown: () -> Unit @@ -1061,7 +1063,8 @@ private class EmulationSession( initialized = romData != null && NativeBridge.nativeInitialize( romData, romName, - saveDirectory.absolutePath + saveDirectory.absolutePath, + frameRateEnhancementEnabled ) audioTrack = if (initialized) createAudioTrack() else null } diff --git a/app/src/main/java/io/github/uplush/dingoobox/NativeBridge.kt b/app/src/main/java/io/github/uplush/dingoobox/NativeBridge.kt index e59cc71..7d15520 100644 --- a/app/src/main/java/io/github/uplush/dingoobox/NativeBridge.kt +++ b/app/src/main/java/io/github/uplush/dingoobox/NativeBridge.kt @@ -12,7 +12,8 @@ object NativeBridge { external fun nativeInitialize( romData: ByteArray, romName: String, - saveDirectory: String + saveDirectory: String, + frameRateEnhancementEnabled: Boolean ): Boolean external fun nativeRunFrame(bitmap: Bitmap, audioBuffer: ShortArray): Int external fun nativeSetButton(buttonId: Int, pressed: Boolean) diff --git a/app/src/main/java/io/github/uplush/dingoobox/SettingsScreen.kt b/app/src/main/java/io/github/uplush/dingoobox/SettingsScreen.kt index 6c33cc4..bfa8654 100644 --- a/app/src/main/java/io/github/uplush/dingoobox/SettingsScreen.kt +++ b/app/src/main/java/io/github/uplush/dingoobox/SettingsScreen.kt @@ -426,6 +426,14 @@ private fun ColumnScope.AdvancedSettings( update: (AppSettingsState) -> Unit, onFastForward: () -> Unit ) { + SwitchSettingRow( + title = appStringResource(R.string.settings_frame_rate_enhancement_title), + description = appStringResource(R.string.settings_frame_rate_enhancement_description), + checked = settings.frameRateEnhancementEnabled, + enabled = !embeddedInPauseMenu, + onCheckedChange = { update(settings.copy(frameRateEnhancementEnabled = it)) } + ) + HorizontalDivider() SwitchSettingRow( title = appStringResource(R.string.settings_auto_save_title), description = appStringResource( diff --git a/app/src/main/jniLibs/arm64-v8a/libdingooemu.so b/app/src/main/jniLibs/arm64-v8a/libdingooemu.so index 072bf36..58e4cd1 100755 Binary files a/app/src/main/jniLibs/arm64-v8a/libdingooemu.so and b/app/src/main/jniLibs/arm64-v8a/libdingooemu.so differ diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index d82fd3c..38cb19b 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -57,6 +57,8 @@ 退出时自动保存 退出游戏时自动创建恢复存档 仅在游戏中可以调整该设置 + 帧率增强 + 提升部分游戏帧率 游戏加速倍率 设置开启游戏加速时的运行速度 不限制 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5817861..8bb95aa 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -57,6 +57,8 @@ Auto-save on exit Automatically create a recovery save state when exiting a game This setting can only be adjusted while a game is running + Frame rate enhancement + Improve frame rates in supported games Fast-forward multiplier Set the running speed used when fast-forward is enabled Unlimited diff --git a/native/DingooEmu b/native/DingooEmu index bca43a3..23e9b87 160000 --- a/native/DingooEmu +++ b/native/DingooEmu @@ -1 +1 @@ -Subproject commit bca43a38e1b771eb8bec466ab799249f4c6eeaf8 +Subproject commit 23e9b87ce06fc36cb2016ad3b73b5b7fc2abcdf0