From b9ef1c1deccff73922d504fea3ee237b68842bcb Mon Sep 17 00:00:00 2001 From: Kleidis <167202775+kleidis@users.noreply.github.com> Date: Tue, 4 Mar 2025 19:57:33 +0100 Subject: [PATCH 1/3] android: Improve performance stats overlay settings and functionality --- .../features/settings/model/BooleanSetting.kt | 12 +- .../features/settings/model/IntSetting.kt | 3 +- .../features/settings/model/Settings.kt | 1 + .../settings/ui/SettingsFragmentPresenter.kt | 110 +++++++++++++ .../citra_emu/fragments/EmulationFragment.kt | 148 ++++++++++++++---- .../citra_emu/utils/EmulationMenuSettings.kt | 6 +- .../app/src/main/res/drawable/ic_frames.xml | 32 ++++ .../main/res/layout/fragment_emulation.xml | 2 +- .../main/res/menu/menu_overlay_options.xml | 4 +- .../main/res/values-night/citra_colors.xml | 1 + .../app/src/main/res/values/arrays.xml | 17 ++ .../app/src/main/res/values/citra_colors.xml | 1 + .../app/src/main/res/values/strings.xml | 28 ++++ src/citra_sdl/default_ini.h | 9 ++ 14 files changed, 331 insertions(+), 43 deletions(-) create mode 100644 src/android/app/src/main/res/drawable/ic_frames.xml diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt index 4e5481d7c..1d523af54 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt @@ -15,7 +15,15 @@ enum class BooleanSetting( ALLOW_PLUGIN_LOADER("allow_plugin_loader", Settings.SECTION_SYSTEM, true), SWAP_SCREEN("swap_screen", Settings.SECTION_LAYOUT, false), INSTANT_DEBUG_LOG("instant_debug_log", Settings.SECTION_DEBUG, false), - CUSTOM_LAYOUT("custom_layout",Settings.SECTION_LAYOUT,false); + CUSTOM_LAYOUT("custom_layout",Settings.SECTION_LAYOUT,false), + SHOW_FPS("show_fps", Settings.SECTION_LAYOUT, true), + SHOW_FRAMETIME("show_frame_time", Settings.SECTION_LAYOUT, false), + SHOW_SPEED("show_speed", Settings.SECTION_LAYOUT, false), + SHOW_APP_RAM_USAGE("show_app_ram_usage", Settings.SECTION_LAYOUT, false), + SHOW_SYSTEM_RAM_USAGE("show_system_ram_usage", Settings.SECTION_LAYOUT, false), + SHOW_BAT_TEMPERATURE("show_bat_temperature", Settings.SECTION_LAYOUT, false), + OVERLAY_BACKGROUND("overlay_background", Settings.SECTION_LAYOUT, false); + override var boolean: Boolean = defaultValue @@ -35,7 +43,7 @@ enum class BooleanSetting( companion object { private val NOT_RUNTIME_EDITABLE = listOf( PLUGIN_LOADER, - ALLOW_PLUGIN_LOADER, + ALLOW_PLUGIN_LOADER, ASYNC_SHADERS ) diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/IntSetting.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/IntSetting.kt index 0f1ca8d43..bde78d21f 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/IntSetting.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/IntSetting.kt @@ -64,7 +64,8 @@ enum class IntSetting( DELAY_RENDER_THREAD_US("delay_game_render_thread_us", Settings.SECTION_RENDERER, 0), USE_ARTIC_BASE_CONTROLLER("use_artic_base_controller", Settings.SECTION_CONTROLS, 0), ORIENTATION_OPTION("screen_orientation", Settings.SECTION_LAYOUT, 2), - DISABLE_RIGHT_EYE_RENDER("disable_right_eye_render", Settings.SECTION_RENDERER, 0); + DISABLE_RIGHT_EYE_RENDER("disable_right_eye_render", Settings.SECTION_RENDERER, 0), + PERF_OVERLAY_POSITION("perf_overlay_position", Settings.SECTION_LAYOUT, 0); override var int: Int = defaultValue override val valueAsString: String diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/Settings.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/Settings.kt index 5ea358989..1bed2fc62 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/Settings.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/Settings.kt @@ -111,6 +111,7 @@ class Settings { const val SECTION_THEME = "Theme" const val SECTION_CUSTOM_LANDSCAPE = "Custom Landscape Layout" const val SECTION_CUSTOM_PORTRAIT = "Custom Portrait Layout" + const val SECTION_STATS_OVERLAY = "Stats Overlay" const val KEY_BUTTON_A = "button_a" const val KEY_BUTTON_B = "button_b" diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt index 31401567f..0f3be01bb 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -46,6 +46,7 @@ import org.citra.citra_emu.utils.BirthdayMonth import org.citra.citra_emu.utils.Log import org.citra.citra_emu.utils.SystemSaveGame import org.citra.citra_emu.utils.ThemeUtil +import org.citra.citra_emu.utils.EmulationMenuSettings class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) { private var menuTag: String? = null @@ -101,6 +102,7 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) Settings.SECTION_THEME -> addThemeSettings(sl) Settings.SECTION_CUSTOM_LANDSCAPE -> addCustomLandscapeSettings(sl) Settings.SECTION_CUSTOM_PORTRAIT -> addCustomPortraitSettings(sl) + Settings.SECTION_STATS_OVERLAY -> addStatsOverlaySettings(sl) else -> { fragmentView.showToastMessage("Unimplemented menu", false) return @@ -985,6 +987,14 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) FloatSetting.LARGE_SCREEN_PROPORTION.defaultValue ) ) + add( + SubmenuSetting( + R.string.stats_overlay_options, + R.string.stats_overlay_options_description, + R.drawable.ic_frames, + Settings.SECTION_STATS_OVERLAY + ) + ) add( SubmenuSetting( R.string.emulation_landscape_custom_layout, @@ -1004,6 +1014,106 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) } } + private fun addStatsOverlaySettings(sl: ArrayList) { + settingsActivity.setToolbarTitle(settingsActivity.getString(R.string.stats_overlay_options)) + sl.apply { + + add(HeaderSetting(R.string.stats_overlay_customization)) + + add( + SwitchSetting( + object : AbstractBooleanSetting { + override val key = "EmulationMenuSettings_showPerfStatsOvelray" + override val section = Settings.SECTION_LAYOUT + override val defaultValue = false + override var boolean: Boolean + get() = EmulationMenuSettings.showStatsOvelray + set(value) { EmulationMenuSettings.showStatsOvelray = value } + override val isRuntimeEditable = true + override val valueAsString: String get() = boolean.toString() + }, + R.string.enable_stats_overlay_, + 0, + "EmulationMenuSettings_showPerfStatsOvelray", + false + ) + ) + + add( + SwitchSetting( + BooleanSetting.OVERLAY_BACKGROUND, + R.string.overlay_background, + R.string.overlay_background_description, + "overlay_background", + false + ) + ) + + add( + SingleChoiceSetting( + IntSetting.PERF_OVERLAY_POSITION, + R.string.overlay_position, + R.string.overlay_position_description, + R.array.statsPosition, + R.array.statsPositionValues, + ) + ) + + + add(HeaderSetting(R.string.stats_overlay_items)) + + add( + SwitchSetting( + BooleanSetting.SHOW_FPS, + R.string.show_fps, + R.string.show_fps_description, + "show_fps", + true + ) + ) + + add( + SwitchSetting( + BooleanSetting.SHOW_SPEED, + R.string.show_speed, + R.string.show_speed_description, + "show_speed", + false + ) + ) + + add( + SwitchSetting( + BooleanSetting.SHOW_APP_RAM_USAGE, + R.string.show_app_ram_usage, + R.string.show_app_ram_usage_description, + "show_app_ram_usage", + false + ) + ) + + add( + SwitchSetting( + BooleanSetting.SHOW_SYSTEM_RAM_USAGE, + R.string.show_system_ram_usage, + R.string.show_system_ram_usage_description, + "show_system_ram_usage", + false + ) + ) + + add( + SwitchSetting( + BooleanSetting.SHOW_BAT_TEMPERATURE, + R.string.show_bat_temperature, + R.string.show_bat_temperature_description, + "show_bat_temperature", + false + ) + ) + } + } + private fun addCustomLandscapeSettings(sl: ArrayList) { settingsActivity.setToolbarTitle(settingsActivity.getString(R.string.emulation_landscape_custom_layout)) sl.apply { diff --git a/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt index e91876584..defed9868 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt @@ -5,10 +5,14 @@ package org.citra.citra_emu.fragments import android.annotation.SuppressLint +import android.app.ActivityManager import android.content.Context import android.content.DialogInterface +import android.content.Intent +import android.content.IntentFilter import android.content.SharedPreferences import android.net.Uri +import android.os.BatteryManager import android.os.Bundle import android.os.Handler import android.os.Looper @@ -16,6 +20,7 @@ import android.os.SystemClock import android.text.Editable import android.text.TextWatcher import android.view.Choreographer +import android.view.Gravity import android.view.LayoutInflater import android.view.MotionEvent import android.view.Surface @@ -26,6 +31,7 @@ import android.widget.PopupMenu import android.widget.TextView import android.widget.Toast import androidx.activity.OnBackPressedCallback +import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.content.res.ResourcesCompat import androidx.core.graphics.Insets import androidx.core.view.ViewCompat @@ -71,6 +77,8 @@ import org.citra.citra_emu.utils.EmulationLifecycleUtil import org.citra.citra_emu.utils.Log import org.citra.citra_emu.utils.ViewUtils import org.citra.citra_emu.viewmodel.EmulationViewModel +import org.citra.citra_emu.features.settings.model.BooleanSetting +import java.io.File class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.FrameCallback { private val preferences: SharedPreferences @@ -174,8 +182,12 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram binding.surfaceInputOverlay.setIsInEditMode(false) } - // Show/hide the "Show FPS" overlay - updateShowFpsOverlay() + + // Show/hide the "Stats" overlay + updateshowStatsOvelray() + + val position = IntSetting.PERF_OVERLAY_POSITION.int + updateStatsPosition(position) binding.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED) binding.drawerLayout.addDrawerListener(object : DrawerListener { @@ -447,6 +459,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram Choreographer.getInstance().postFrameCallback(this) if (NativeLibrary.isRunning()) { NativeLibrary.unPauseEmulation() + // If the overlay is enabled, we need to update the position if changed + val position = IntSetting.PERF_OVERLAY_POSITION.int + updateStatsPosition(position) return } @@ -624,7 +639,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram popupMenu.menu.apply { findItem(R.id.menu_show_overlay).isChecked = EmulationMenuSettings.showOverlay - findItem(R.id.menu_show_fps).isChecked = EmulationMenuSettings.showFps + findItem(R.id.menu_show_stats_overlay).isChecked = + EmulationMenuSettings.showStatsOvelray findItem(R.id.menu_haptic_feedback).isChecked = EmulationMenuSettings.hapticFeedback findItem(R.id.menu_emulation_joystick_rel_center).isChecked = EmulationMenuSettings.joystickRelCenter @@ -640,15 +656,15 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram true } - R.id.menu_show_fps -> { - EmulationMenuSettings.showFps = !EmulationMenuSettings.showFps - updateShowFpsOverlay() + R.id.menu_show_stats_overlay -> { + EmulationMenuSettings.showStatsOvelray = !EmulationMenuSettings.showStatsOvelray + updateshowStatsOvelray() true } R.id.menu_haptic_feedback -> { EmulationMenuSettings.hapticFeedback = !EmulationMenuSettings.hapticFeedback - updateShowFpsOverlay() + updateshowStatsOvelray() true } @@ -1128,34 +1144,115 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram binding.surfaceInputOverlay.resetButtonPlacement() } - fun updateShowFpsOverlay() { - if (EmulationMenuSettings.showFps) { + fun updateshowStatsOvelray() { + if (EmulationMenuSettings.showStatsOvelray) { val SYSTEM_FPS = 0 val FPS = 1 val FRAMETIME = 2 val SPEED = 3 perfStatsUpdater = Runnable { + val sb = StringBuilder() val perfStats = NativeLibrary.getPerfStats() + val ramUsage = + File("/proc/self/statm").readLines()[0].split(' ')[1].toLong() * 4096 / 1000000 + val ramUsageText = "RAM USAGE: " + ramUsage + " MB" if (perfStats[FPS] > 0) { - binding.showFpsText.text = String.format( - "FPS: %d Speed: %d%% FT: %.2fms", - (perfStats[FPS] + 0.5).toInt(), - (perfStats[SPEED] * 100.0 + 0.5).toInt(), - (perfStats[FRAMETIME] * 1000.0f).toFloat() - ) + if (BooleanSetting.SHOW_FPS.boolean) { + sb.append(String.format("FPS: %d", (perfStats[FPS] + 0.5).toInt())) + } + + if (BooleanSetting.SHOW_SPEED.boolean) { + if (sb.isNotEmpty()) sb.append(" | ") + sb.append( + String.format( + "Speed: %d%%", + (perfStats[SPEED] * 100.0 + 0.5).toInt() + ) + ) + } + + if (BooleanSetting.SHOW_APP_RAM_USAGE.boolean) { + if (sb.isNotEmpty()) sb.append(" | ") + val appRamUsage = + File("/proc/self/statm").readLines()[0].split(' ')[1].toLong() * 4096 / 1000000 + sb.append("Process RAM: $appRamUsage MB") + } + + if (BooleanSetting.SHOW_SYSTEM_RAM_USAGE.boolean) { + if (sb.isNotEmpty()) sb.append(" | ") + context?.let { ctx -> + val activityManager = + ctx.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager + val memInfo = ActivityManager.MemoryInfo() + activityManager.getMemoryInfo(memInfo) + val usedRamMB = (memInfo.totalMem - memInfo.availMem) / 1048576L + sb.append("RAM: $usedRamMB MB") + } + } + + if (BooleanSetting.SHOW_BAT_TEMPERATURE.boolean) { + if (sb.isNotEmpty()) sb.append(" | ") + val batteryTemp = getBatteryTemperature() + val tempF = celsiusToFahrenheit(batteryTemp) + sb.append(String.format("%.1f°C/%.1f°F", batteryTemp, tempF)) + } + + if (BooleanSetting.OVERLAY_BACKGROUND.boolean) { + binding.showStatsOverlayText.setBackgroundResource(R.color.citra_transparent_black) + } else { + binding.showStatsOverlayText.setBackgroundResource(0) + } + + binding.showStatsOverlayText.text = sb.toString() } perfStatsUpdateHandler.postDelayed(perfStatsUpdater!!, 3000) } perfStatsUpdateHandler.post(perfStatsUpdater!!) - binding.showFpsText.visibility = View.VISIBLE + binding.showStatsOverlayText.visibility = View.VISIBLE } else { if (perfStatsUpdater != null) { perfStatsUpdateHandler.removeCallbacks(perfStatsUpdater!!) } - binding.showFpsText.visibility = View.GONE + binding.showStatsOverlayText.visibility = View.GONE } } + + private fun updateStatsPosition(position: Int) { + val params = binding.showStatsOverlayText.layoutParams as CoordinatorLayout.LayoutParams + when (position) { + 0 -> { + params.gravity = (Gravity.TOP or Gravity.START) + params.setMargins(resources.getDimensionPixelSize(R.dimen.spacing_large), 0, 0, 0) + } + + 1 -> { + params.gravity = (Gravity.TOP or Gravity.CENTER_HORIZONTAL) + } + + 2 -> { + params.gravity = (Gravity.TOP or Gravity.END) + params.setMargins(0, 0, resources.getDimensionPixelSize(R.dimen.spacing_large), 0) + } + + 3 -> { + params.gravity = (Gravity.BOTTOM or Gravity.START) + params.setMargins(resources.getDimensionPixelSize(R.dimen.spacing_large), 0, 0, 0) + } + + 4 -> { + params.gravity = (Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL) + } + + 5 -> { + params.gravity = (Gravity.BOTTOM or Gravity.END) + params.setMargins(0, 0, resources.getDimensionPixelSize(R.dimen.spacing_large), 0) + } + } + + binding.showStatsOverlayText.layoutParams = params + } + override fun surfaceCreated(holder: SurfaceHolder) { // We purposely don't do anything here. // All work is done in surfaceChanged, which we are guaranteed to get even for surface creation. @@ -1190,23 +1287,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram v.setPadding(left, cutInsets.top, right, 0) - // Ensure FPS text doesn't get cut off by rounded display corners - val sidePadding = resources.getDimensionPixelSize(R.dimen.spacing_large) - if (cutInsets.left == 0) { - binding.showFpsText.setPadding( - sidePadding, - cutInsets.top, - cutInsets.right, - cutInsets.bottom - ) - } else { - binding.showFpsText.setPadding( - cutInsets.left, - cutInsets.top, - cutInsets.right, - cutInsets.bottom - ) - } windowInsets } } diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/EmulationMenuSettings.kt b/src/android/app/src/main/java/org/citra/citra_emu/utils/EmulationMenuSettings.kt index 660842aa8..193fc0e23 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/utils/EmulationMenuSettings.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/EmulationMenuSettings.kt @@ -27,11 +27,11 @@ object EmulationMenuSettings { .apply() } - var showFps: Boolean - get() = preferences.getBoolean("EmulationMenuSettings_ShowFps", false) + var showStatsOvelray: Boolean + get() = preferences.getBoolean("EmulationMenuSettings_showStatsOvelray", false) set(value) { preferences.edit() - .putBoolean("EmulationMenuSettings_ShowFps", value) + .putBoolean("EmulationMenuSettings_showStatsOvelray", value) .apply() } var hapticFeedback: Boolean diff --git a/src/android/app/src/main/res/drawable/ic_frames.xml b/src/android/app/src/main/res/drawable/ic_frames.xml new file mode 100644 index 000000000..aee24007b --- /dev/null +++ b/src/android/app/src/main/res/drawable/ic_frames.xml @@ -0,0 +1,32 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/android/app/src/main/res/layout/fragment_emulation.xml b/src/android/app/src/main/res/layout/fragment_emulation.xml index 91bf7562c..078d2f05e 100644 --- a/src/android/app/src/main/res/layout/fragment_emulation.xml +++ b/src/android/app/src/main/res/layout/fragment_emulation.xml @@ -117,7 +117,7 @@ #B7B7B7 + #80000000 #C6C5D0 #FFB4AB #93000A diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml index 4159d9e4e..4f05db081 100644 --- a/src/android/app/src/main/res/values/arrays.xml +++ b/src/android/app/src/main/res/values/arrays.xml @@ -113,6 +113,23 @@ 11 + + @string/overlay_position_top_left + @string/overlay_position_center_top + @string/overlay_position_top_right + @string/overlay_position_bottom_left + @string/overlay_position_center_bottom + @string/overlay_position_bottom_right + + + 0 + 1 + 2 + 3 + 4 + 5 + + @string/button_a @string/button_b diff --git a/src/android/app/src/main/res/values/citra_colors.xml b/src/android/app/src/main/res/values/citra_colors.xml index e87a2a75b..746604d56 100644 --- a/src/android/app/src/main/res/values/citra_colors.xml +++ b/src/android/app/src/main/res/values/citra_colors.xml @@ -222,6 +222,7 @@ #9E9E9E + #80000000 #C6C5D0 #BA1A1A #FFDAD6 diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 5495a2a23..51d96329c 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -478,6 +478,34 @@ Play Shortcut + + ShoW Performance Stats Overlay + Customization + Visibility + Performance Stats Overlay + Enable Performance Stats Overlay + Configure what information is shown in the performance stats overlay + Show FPS + Display current frames per second + Show Speed + Display current emulation speed percentage + Show App Memory Usage + Display the amount of RAM getting used by the emulator + Show System Memory Usage + Display the amount of RAM getting used by the system + Show Battery Temperature + Display current Battery temperature in Celsius and Fahrenheit + Overlay Position + Choose where the performance stats overlay is displayed on the screen + Top Left + Top Right + Bottom Left + Bottom Right + Center Top + Center Bottom + Overlay Background + Adds a background behind the overlay for easier reading + Cheats Add Cheat diff --git a/src/citra_sdl/default_ini.h b/src/citra_sdl/default_ini.h index a3d670752..cb80c49bc 100644 --- a/src/citra_sdl/default_ini.h +++ b/src/citra_sdl/default_ini.h @@ -191,6 +191,15 @@ filter_mode = # 6: Custom Layout layout_option = +# Position of the performance overlay +# 0: Top Left +# 1: Center Top +# 2: Top Right +# 3: Bottom Left +# 4: Center Bottom +# 5: Bottom Right +perf_overlay_position = + # Screen placement when using Custom layout option # 0x, 0y is the top left corner of the render window. custom_top_x = From 38accad5d2389e6ac136a83903afd54960754388 Mon Sep 17 00:00:00 2001 From: Zephyron Date: Tue, 4 Mar 2025 20:00:58 +0100 Subject: [PATCH 2/3] Add battery temp functions --- .../citra_emu/fragments/EmulationFragment.kt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt index defed9868..04d393ddf 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt @@ -1253,6 +1253,22 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram binding.showStatsOverlayText.layoutParams = params } + private fun getBatteryTemperature(): Float { + try { + val batteryIntent = requireContext().registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED)) + // Temperature in tenths of a degree Celsius + val temperature = batteryIntent?.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, 0) ?: 0 + // Convert to degrees Celsius + return temperature / 10.0f + } catch (e: Exception) { + return 0.0f + } + } + private fun celsiusToFahrenheit(celsius: Float): Float { + return (celsius * 9 / 5) + 32 + } + + override fun surfaceCreated(holder: SurfaceHolder) { // We purposely don't do anything here. // All work is done in surfaceChanged, which we are guaranteed to get even for surface creation. From 7eb0bb2170120e42bfd12984375109e466a0b08a Mon Sep 17 00:00:00 2001 From: Kleidis <167202775+kleidis@users.noreply.github.com> Date: Wed, 5 Mar 2025 21:00:10 +0100 Subject: [PATCH 3/3] Readd frametime --- .../features/settings/model/BooleanSetting.kt | 2 +- .../features/settings/ui/SettingsFragmentPresenter.kt | 10 ++++++++++ .../org/citra/citra_emu/fragments/EmulationFragment.kt | 10 ++++++++++ src/android/app/src/main/res/values/strings.xml | 2 ++ 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt index 1d523af54..d010ddbf1 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt @@ -17,7 +17,7 @@ enum class BooleanSetting( INSTANT_DEBUG_LOG("instant_debug_log", Settings.SECTION_DEBUG, false), CUSTOM_LAYOUT("custom_layout",Settings.SECTION_LAYOUT,false), SHOW_FPS("show_fps", Settings.SECTION_LAYOUT, true), - SHOW_FRAMETIME("show_frame_time", Settings.SECTION_LAYOUT, false), + SHOW_FRAMETIME("show_frame_time", Settings.SECTION_LAYOUT, false), SHOW_SPEED("show_speed", Settings.SECTION_LAYOUT, false), SHOW_APP_RAM_USAGE("show_app_ram_usage", Settings.SECTION_LAYOUT, false), SHOW_SYSTEM_RAM_USAGE("show_system_ram_usage", Settings.SECTION_LAYOUT, false), diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt index 0f3be01bb..35dee68c1 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -1072,6 +1072,16 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) ) ) + add( + SwitchSetting( + BooleanSetting.SHOW_FRAMETIME, + R.string.show_frametime, + R.string.show_frametime_description, + "show_frame_time", + true + ) + ) + add( SwitchSetting( BooleanSetting.SHOW_SPEED, diff --git a/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt index 04d393ddf..c232030f5 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt @@ -1161,6 +1161,16 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram sb.append(String.format("FPS: %d", (perfStats[FPS] + 0.5).toInt())) } + if (BooleanSetting.SHOW_FRAMETIME.boolean) { + if (sb.isNotEmpty()) sb.append(" | ") + sb.append( + String.format( + "FT: %.1fms", + (perfStats[FRAMETIME] * 1000.0f).toFloat() + ) + ) + } + if (BooleanSetting.SHOW_SPEED.boolean) { if (sb.isNotEmpty()) sb.append(" | ") sb.append( diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 51d96329c..ec50c6695 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -487,6 +487,8 @@ Configure what information is shown in the performance stats overlay Show FPS Display current frames per second + Show Frametime + Display current frametime Show Speed Display current emulation speed percentage Show App Memory Usage