Просмотр исходного кода

android: Add a notice when RAM inadequate

Abandoned Cart 3 лет назад
Родитель
Сommit
699e78c666

+ 16 - 1
src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt

@@ -27,13 +27,13 @@ import android.view.MotionEvent
 import android.view.Surface
 import android.view.View
 import android.view.inputmethod.InputMethodManager
+import android.widget.Toast
 import androidx.activity.viewModels
 import androidx.appcompat.app.AppCompatActivity
 import androidx.core.view.WindowCompat
 import androidx.core.view.WindowInsetsCompat
 import androidx.core.view.WindowInsetsControllerCompat
 import androidx.navigation.fragment.NavHostFragment
-import kotlin.math.roundToInt
 import org.yuzu.yuzu_emu.NativeLibrary
 import org.yuzu.yuzu_emu.R
 import org.yuzu.yuzu_emu.databinding.ActivityEmulationBinding
@@ -44,8 +44,10 @@ import org.yuzu.yuzu_emu.model.Game
 import org.yuzu.yuzu_emu.utils.ControllerMappingHelper
 import org.yuzu.yuzu_emu.utils.ForegroundService
 import org.yuzu.yuzu_emu.utils.InputHandler
+import org.yuzu.yuzu_emu.utils.MemoryUtil
 import org.yuzu.yuzu_emu.utils.NfcReader
 import org.yuzu.yuzu_emu.utils.ThemeHelper
+import kotlin.math.roundToInt
 
 class EmulationActivity : AppCompatActivity(), SensorEventListener {
     private lateinit var binding: ActivityEmulationBinding
@@ -102,6 +104,19 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
         inputHandler = InputHandler()
         inputHandler.initialize()
 
+        val memoryUtil = MemoryUtil(this)
+        if (memoryUtil.isLessThan(8, MemoryUtil.Gb)) {
+            Toast.makeText(
+                this,
+                getString(
+                    R.string.device_memory_inadequate_description,
+                    memoryUtil.getDeviceRAM(),
+                    "8 GB"
+                ),
+                Toast.LENGTH_LONG
+            ).show()
+        }
+
         // Start a foreground service to prevent the app from getting killed in the background
         val startIntent = Intent(this, ForegroundService::class.java)
         startForegroundService(startIntent)

+ 58 - 0
src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/MemoryUtil.kt

@@ -0,0 +1,58 @@
+// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+package org.yuzu.yuzu_emu.utils
+
+import android.app.ActivityManager
+import android.content.Context
+import java.util.Locale
+
+class MemoryUtil(context: Context) {
+
+    private val Long.floatForm: String
+        get() = String.format(Locale.ROOT, "%.2f", this.toDouble())
+
+    private fun bytesToSizeUnit(size: Long): String {
+        return when {
+            size < Kb -> size.floatForm + " byte"
+            size < Mb -> (size / Kb).floatForm + " KB"
+            size < Gb -> (size / Mb).floatForm + " MB"
+            size < Tb -> (size / Gb).floatForm + " GB"
+            size < Pb -> (size / Tb).floatForm + " TB"
+            size < Eb -> (size / Pb).floatForm + " Pb"
+            else -> (size / Eb).floatForm + " Eb"
+        }
+    }
+
+    private val totalMemory =
+        with(context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager) {
+            val memInfo = ActivityManager.MemoryInfo()
+            getMemoryInfo(memInfo)
+            memInfo.totalMem
+        }
+
+    fun isLessThan(minimum: Int, size: Long): Boolean {
+        return when (size) {
+            Kb -> totalMemory < Mb && totalMemory < minimum
+            Mb -> totalMemory < Gb && (totalMemory / Mb) < minimum
+            Gb -> totalMemory < Tb && (totalMemory / Gb) < minimum
+            Tb -> totalMemory < Pb && (totalMemory / Tb) < minimum
+            Pb -> totalMemory < Eb && (totalMemory / Pb) < minimum
+            Eb -> totalMemory / Eb < minimum
+            else -> totalMemory < Kb && totalMemory < minimum
+        }
+    }
+
+    fun getDeviceRAM(): String {
+        return bytesToSizeUnit(totalMemory)
+    }
+
+    companion object {
+        const val Kb: Long = 1024
+        const val Mb = Kb * 1024
+        const val Gb = Mb * 1024
+        const val Tb = Gb * 1024
+        const val Pb = Tb * 1024
+        const val Eb = Pb * 1024
+    }
+}

+ 1 - 0
src/android/app/src/main/res/values/strings.xml

@@ -270,6 +270,7 @@
     <string name="fatal_error">Fatal Error</string>
     <string name="fatal_error_message">A fatal error occurred. Check the log for details.\nContinuing emulation may result in crashes and bugs.</string>
     <string name="performance_warning">Turning off this setting will significantly reduce emulation performance! For the best experience, it is recommended that you leave this setting enabled.</string>
+    <string name="device_memory_inadequate_description">Device RAM: %1$s\nRecommended: %2$s</string>
 
     <!-- Region Names -->
     <string name="region_japan">Japan</string>