From 240b7fcce6688b7b457bc2ca6a38ab8887d359b2 Mon Sep 17 00:00:00 2001 From: xXJsonDeruloXx Date: Thu, 22 Oct 2026 09:02:37 -0400 Subject: [PATCH] feat: page the session out to zram before suspending it, and zram is always on where supported --- .../com/droiddeck/launcher/MainActivity.kt | 8 --- .../droiddeck/launcher/core/ZramSupport.kt | 16 ----- .../launcher/session/SessionPrefs.kt | 10 ---- .../launcher/session/SessionService.kt | 18 +++++- .../session/SessionSuspendController.kt | 60 ++++++++++++++++++- .../launcher/ui/ModeSettingsDialog.kt | 9 --- app/src/main/res/values-ar/strings.xml | 3 - app/src/main/res/values-b+es+419/strings.xml | 3 - app/src/main/res/values-bg/strings.xml | 3 - app/src/main/res/values-cs/strings.xml | 3 - app/src/main/res/values-da/strings.xml | 3 - app/src/main/res/values-de/strings.xml | 3 - app/src/main/res/values-el/strings.xml | 3 - app/src/main/res/values-es/strings.xml | 3 - app/src/main/res/values-fi/strings.xml | 3 - app/src/main/res/values-fr/strings.xml | 3 - app/src/main/res/values-hi/strings.xml | 3 - app/src/main/res/values-hu/strings.xml | 3 - app/src/main/res/values-in/strings.xml | 3 - app/src/main/res/values-it/strings.xml | 3 - app/src/main/res/values-ja/strings.xml | 3 - app/src/main/res/values-ko/strings.xml | 3 - app/src/main/res/values-ms/strings.xml | 3 - app/src/main/res/values-nb/strings.xml | 3 - app/src/main/res/values-nl/strings.xml | 3 - app/src/main/res/values-pl/strings.xml | 3 - app/src/main/res/values-pt-rPT/strings.xml | 3 - app/src/main/res/values-pt/strings.xml | 3 - app/src/main/res/values-ro/strings.xml | 3 - app/src/main/res/values-ru/strings.xml | 3 - app/src/main/res/values-sv/strings.xml | 3 - app/src/main/res/values-th/strings.xml | 3 - app/src/main/res/values-tr/strings.xml | 3 - app/src/main/res/values-uk/strings.xml | 3 - app/src/main/res/values-vi/strings.xml | 3 - app/src/main/res/values-zh-rCN/strings.xml | 3 - app/src/main/res/values-zh-rHK/strings.xml | 3 - app/src/main/res/values-zh-rTW/strings.xml | 3 - app/src/main/res/values/strings.xml | 3 - .../launcher/core/ZramSupportTest.kt | 14 ----- .../session/SessionSuspendControllerTest.kt | 48 ++++++++++++++- .../overlay/usr/local/bin/droiddeck-session | 6 +- tools/linuxfs/preload/zram.c | 2 - 43 files changed, 122 insertions(+), 168 deletions(-) diff --git a/app/src/main/java/com/droiddeck/launcher/MainActivity.kt b/app/src/main/java/com/droiddeck/launcher/MainActivity.kt index 4e455d3c1..280c2dabd 100644 --- a/app/src/main/java/com/droiddeck/launcher/MainActivity.kt +++ b/app/src/main/java/com/droiddeck/launcher/MainActivity.kt @@ -392,8 +392,6 @@ class MainActivity : ComponentActivity() { private var touchMode by mutableStateOf(SessionPrefs.TOUCH_AUTO) private var suspendPolicy by mutableStateOf(SessionPrefs.SUSPEND_MANUAL) private var steamDownloadsInBackground by mutableStateOf(false) - private var zramCompression by mutableStateOf(false) - private var zramSupported by mutableStateOf(null) private var oscMode by mutableStateOf(SessionPrefs.OSC_AUTO) private var backActionsInverted by mutableStateOf(false) private var gameStorage by mutableStateOf("") @@ -1616,8 +1614,6 @@ class MainActivity : ComponentActivity() { touchMode = touchMode, suspendPolicy = suspendPolicy, steamDownloadsInBackground = steamDownloadsInBackground, - zramCompression = if (mode == SessionService.MODE_STEAM) zramCompression else null, - zramSupported = zramSupported, pipSupported = com.droiddeck.launcher.session.SessionPipController.supported(this), pipAutoEnter = pipAutoEnter, unfoldedControls = if (mode == SessionService.MODE_STEAM && @@ -1685,7 +1681,6 @@ class MainActivity : ComponentActivity() { SessionPrefs.setSteamDownloadsInBackground(this, enabled) steamDownloadsInBackground = enabled }, - onZramCompression = { on -> SessionPrefs.setZramCompression(this, on); zramCompression = on }, onPipAutoEnter = { on -> SessionPrefs.setPipAutoEnter(this, on); pipAutoEnter = on }, onUnfoldedControls = { on -> SessionPrefs.setUnfoldedControls(this, on); unfoldedControls = on }, onOsc = { o -> SessionPrefs.setOscMode(this, o); oscMode = o }, @@ -1912,9 +1907,6 @@ class MainActivity : ComponentActivity() { storageDiagnostics = SessionPrefs.storageDiagnosticsEnabled(this) settingsMode = mode Thread({ - val zram = com.droiddeck.launcher.core.ZramSupport.supported() - val zramOn = SessionPrefs.zramCompression(this) - ui.post { zramSupported = zram; zramCompression = zramOn } drivers.refreshDrivers() val storage = GameStorage.options(this) val deckyInstalled = if (mode == SessionService.MODE_STEAM) DeckyManager.installed(this) else null diff --git a/app/src/main/java/com/droiddeck/launcher/core/ZramSupport.kt b/app/src/main/java/com/droiddeck/launcher/core/ZramSupport.kt index 51c3b2494..3befaac38 100644 --- a/app/src/main/java/com/droiddeck/launcher/core/ZramSupport.kt +++ b/app/src/main/java/com/droiddeck/launcher/core/ZramSupport.kt @@ -1,26 +1,10 @@ package com.droiddeck.launcher.core -import android.app.ActivityManager -import android.content.Context -import android.os.Build import java.io.File object ZramSupport { - private const val GIB = 1L shl 30 - fun supported(): Boolean = kernelAtLeast(System.getProperty("os.version").orEmpty(), 5, 4) && swapTotalKb() > 0 - fun recommended(context: Context): Boolean { - if (!supported()) return false - val memory = ActivityManager.MemoryInfo() - context.getSystemService(ActivityManager::class.java).getMemoryInfo(memory) - val advertised = if (Build.VERSION.SDK_INT >= 34) memory.advertisedMem else 0L - return belowTwelveGb(advertised, memory.totalMem) - } - - fun belowTwelveGb(advertisedBytes: Long, totalBytes: Long): Boolean = - if (advertisedBytes > 0) advertisedBytes < 11 * GIB else totalBytes < 10 * GIB - fun kernelAtLeast(release: String, major: Int, minor: Int): Boolean { val parts = Regex("^(\\d+)\\.(\\d+)").find(release)?.groupValues ?: return false val ma = parts[1].toInt() diff --git a/app/src/main/java/com/droiddeck/launcher/session/SessionPrefs.kt b/app/src/main/java/com/droiddeck/launcher/session/SessionPrefs.kt index b548e56de..c988bc5ab 100644 --- a/app/src/main/java/com/droiddeck/launcher/session/SessionPrefs.kt +++ b/app/src/main/java/com/droiddeck/launcher/session/SessionPrefs.kt @@ -7,7 +7,6 @@ import com.droiddeck.launcher.R import com.droiddeck.launcher.core.CpuAllocationDefaults import com.droiddeck.launcher.core.GameEnvironment import com.droiddeck.launcher.core.TextureFiltering -import com.droiddeck.launcher.core.ZramSupport import com.droiddeck.launcher.gpu.Cardboard import com.droiddeck.launcher.gpu.ScreenEffects import org.json.JSONObject @@ -1034,15 +1033,6 @@ object SessionPrefs { }.apply() } - fun zramCompression(context: Context): Boolean { - val prefs = prefs(context) - return if (prefs.contains("zramCompression")) prefs.getBoolean("zramCompression", false) else ZramSupport.recommended(context) - } - - fun setZramCompression(context: Context, on: Boolean) { - prefs(context).edit().putBoolean("zramCompression", on).apply() - } - fun gameStorage(context: Context): String = prefs(context).getString("gameStorage", "") ?: "" diff --git a/app/src/main/java/com/droiddeck/launcher/session/SessionService.kt b/app/src/main/java/com/droiddeck/launcher/session/SessionService.kt index c1b0ab86d..839cb28a5 100644 --- a/app/src/main/java/com/droiddeck/launcher/session/SessionService.kt +++ b/app/src/main/java/com/droiddeck/launcher/session/SessionService.kt @@ -581,6 +581,17 @@ class SessionService : Service() { resumeAudio = { if (!pulse.setSinkSuspended(false)) Log.w(TAG, "could not resume audio sink") }, + zramControl = File(filesDir, "${LinuxRuntime.DIR}/tmp/.bl-zram"), + pagedOut = { processes, residentKb, swapKb, swapBeforeKb, millis -> + Log.i(TAG, "paged out $processes processes in $millis ms: resident ${residentKb / 1024} MB, " + + "zram ${swapBeforeKb / 1024} -> ${swapKb / 1024} MB") + mainHandler.post { + SessionEvents.record("session.paged_out", mapOf( + "processes" to processes, "residentMb" to residentKb / 1024, + "swapMb" to swapKb / 1024, "swapBeforeMb" to swapBeforeKb / 1024, "ms" to millis, + )) + } + }, ) mainHandler.post { updateSuspendPolicy() } updateDownloadMonitoring() @@ -661,8 +672,7 @@ class SessionService : Service() { guest.add("BL_SYNC_FALLBACK=" + (if (SessionPrefs.syncFallback(this)) "1" else "0")) guest.add("BL_FSYNC_FIRST=" + (if (SessionPrefs.fsyncFirst(this)) "1" else "0")) guest.add("BL_GAMESCOPE_REALTIME=" + (if (SessionPrefs.gamescopeRealtime(this)) "1" else "0")) - if (SessionState.mode == MODE_STEAM && SessionPrefs.zramCompression(this) && - com.droiddeck.launcher.core.ZramSupport.supported()) guest.add("BL_ZRAM=1") + if (com.droiddeck.launcher.core.ZramSupport.supported()) guest.add("BL_ZRAM=1") guest.add("BANNER_AUDIO_DIRECT_DECAY=0") val extra = extraEnv() + com.droiddeck.launcher.agent.AgentEnv.beginSession(this) if (extra.none { it.startsWith("TU_DEBUG=") }) guest.add("$GAME_TU_DEBUG=" + (tuOverride ?: if (tuDriver) "sysmem" else "")) @@ -1386,7 +1396,9 @@ class SessionService : Service() { "nativeSleep" to (nativeSleepToken != null), )) if (shouldSuspend) { - controller.freeze { success -> + controller.freeze( + pageOut = steamSleepToken != null || nativeSleepToken != null || !activityVisible || !screenOn, + ) { success -> mainHandler.post { if (gen != sessionGen || !SessionState.running) return@post suspendOperationPending = false diff --git a/app/src/main/java/com/droiddeck/launcher/session/SessionSuspendController.kt b/app/src/main/java/com/droiddeck/launcher/session/SessionSuspendController.kt index d694d6786..268719f55 100644 --- a/app/src/main/java/com/droiddeck/launcher/session/SessionSuspendController.kt +++ b/app/src/main/java/com/droiddeck/launcher/session/SessionSuspendController.kt @@ -18,6 +18,8 @@ internal class SessionSuspendController( private val sleep: (Long) -> Unit = Thread::sleep, private val nowMillis: () -> Long = { System.nanoTime() / 1_000_000 }, private val executor: ExecutorService = Executors.newSingleThreadExecutor(), + private val zramControl: File? = null, + private val pagedOut: (processes: Int, residentKb: Long, swapKb: Long, swapBeforeKb: Long, millis: Long) -> Unit = { _, _, _, _, _ -> }, ) { private enum class Role { SESSION_ROOT, SESSION_CHILD, HELPER_ROOT, HELPER_CHILD } @@ -40,7 +42,7 @@ internal class SessionSuspendController( @Volatile private var closing = false private var frozen = emptyList() - fun freeze(completion: (Boolean) -> Unit) { + fun freeze(pageOut: Boolean = false, completion: (Boolean) -> Unit) { submit({ val records = frozen.associateByTo(LinkedHashMap()) { it.pid to it.started } var complete = false @@ -59,6 +61,7 @@ internal class SessionSuspendController( records[it.pid to it.started] = ProcessRecord(it.pid, it.started, Role.HELPER_ROOT) } } + if (pageOut) pageOut(records, root.pid, helpers) val deadline = nowMillis() + FREEZE_TIMEOUT_MS var previous: Map? = null for (pass in 0 until FREEZE_MAX_PASSES) { @@ -233,6 +236,57 @@ internal class SessionSuspendController( return tasks.takeIf { stopped && it.isNotEmpty() } } + // A stopped process cannot run libblsession's SIGURG handler, so the page-out has to finish + // before the stop. Android's low-memory killer otherwise finds the frozen game resident in RAM + // with most of zram still free. + private fun pageOut(records: MutableMap, ProcessRecord>, root: Int, helpers: List) { + val control = zramControl?.takeIf { it.isFile } ?: return + try { + addSnapshot(records, root, helpers) + control.writeText("1") + } catch (_: IOException) { + return + } + val targets = records.values.filter { record -> + try { + File(procRoot, "${record.pid}/maps").useLines { lines -> lines.any { it.endsWith("/libblsession.so") } } + } catch (_: IOException) { + false + } + } + if (targets.isEmpty()) return + val start = nowMillis() + val before = memoryKb(targets) + for (record in targets) send(record, SIGURG) + var previous = before.second + var steady = 0 + while (steady < PAGE_OUT_STEADY_POLLS && nowMillis() - start < PAGE_OUT_TIMEOUT_MS) { + sleep(PAGE_OUT_POLL_MS) + val swap = memoryKb(targets).second + steady = if (swap == previous) steady + 1 else 0 + previous = swap + } + val after = memoryKb(targets) + pagedOut(targets.size, after.first, after.second, before.second, nowMillis() - start) + } + + private fun memoryKb(records: List): Pair { + var resident = 0L + var swap = 0L + for (record in records) { + try { + File(procRoot, "${record.pid}/status").useLines { lines -> + for (line in lines) { + val kb = line.substringAfter(':').trim().substringBefore(' ').toLongOrNull() ?: continue + if (line.startsWith("VmRSS:")) resident += kb else if (line.startsWith("VmSwap:")) swap += kb + } + } + } catch (_: IOException) { + } + } + return resident to swap + } + // PRoot traces every guest. A stop sent while it runs becomes a group stop that it restarts // thread by thread; once it is stopped, each thread that takes a SIGSTOP stays parked in its // signal-delivery stop. So the roots stop first and every guest thread gets its own SIGSTOP. @@ -310,6 +364,10 @@ internal class SessionSuspendController( private companion object { const val SIGSTOP = 19 const val SIGCONT = 18 + const val SIGURG = 23 + const val PAGE_OUT_POLL_MS = 250L + const val PAGE_OUT_STEADY_POLLS = 3 + const val PAGE_OUT_TIMEOUT_MS = 12_000L const val RESTORE_CHECKS = 80 const val FREEZE_TIMEOUT_MS = 8_000L const val FREEZE_MAX_PASSES = 256 diff --git a/app/src/main/java/com/droiddeck/launcher/ui/ModeSettingsDialog.kt b/app/src/main/java/com/droiddeck/launcher/ui/ModeSettingsDialog.kt index cb7ec9251..49564945f 100644 --- a/app/src/main/java/com/droiddeck/launcher/ui/ModeSettingsDialog.kt +++ b/app/src/main/java/com/droiddeck/launcher/ui/ModeSettingsDialog.kt @@ -65,8 +65,6 @@ class ModeSettings( val touchMode: String, val suspendPolicy: String, val steamDownloadsInBackground: Boolean = false, - val zramCompression: Boolean? = null, - val zramSupported: Boolean? = null, val pipSupported: Boolean = false, val pipAutoEnter: Boolean = false, val oscMode: String?, @@ -120,7 +118,6 @@ class ModeSettingsActions( val onTouch: (String) -> Unit, val onSuspendPolicy: (String) -> Unit, val onSteamDownloadsInBackground: (Boolean) -> Unit = {}, - val onZramCompression: (Boolean) -> Unit = {}, val onPipAutoEnter: (Boolean) -> Unit = {}, val onOsc: (String) -> Unit, val onBackActionsInverted: (Boolean) -> Unit = {}, @@ -326,12 +323,6 @@ fun ModeSheetRows(s: ModeSettings, a: ModeSettingsActions, tab: String, extras: stringResource(R.string.mode_background_downloads_hint), s.steamDownloadsInBackground, onChange = a.onSteamDownloadsInBackground, ) - if (s.zramCompression != null) ToggleRow( - host, "zram", stringResource(R.string.mode_zram), - stringResource(if (s.zramSupported == false) R.string.mode_zram_unsupported else R.string.mode_zram_hint), - s.zramCompression && s.zramSupported != false, enabled = s.zramSupported == true, - onChange = a.onZramCompression, - ) if (s.syncBackend != null) ChoiceRow( host, "sync", stringResource(R.string.sync_backend_title), stringResource(R.string.sync_backend_hint), listOf( diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 8002743d4..c8944df41 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -287,9 +287,6 @@ «تلقائي» يوقف مؤقتًا ويستأنف عند الظهور. «أصلي» يجهّز Steam للسكون أولًا. «يدوي» ينتظر الضغط على «استئناف». «أبدًا» يُبقيه قيد التشغيل. مواصلة التنزيلات تأخير التعليق في الخلفية أثناء قيام Steam بالتنزيل. - ضغط zRAM - أثناء تشغيل اللعبة يتم ضغط ذاكرة عميل Steam إلى zram في الجهاز، فتحصل اللعبة على ذاكرة RAM أكبر. يسري عند تشغيل Steam في المرة القادمة. - غير متاح: لا يحتوي هذا الجهاز على zram أو swap، أو أن النواة أقدم من 5.4. «تلقائي» يوقف مؤقتًا في الخلفية ويستأنف عند الظهور. «يدوي» ينتظر الضغط على «استئناف». «أبدًا» يُبقيه قيد التشغيل. بدء التشغيل تشغيل Steam مع DroidDeck diff --git a/app/src/main/res/values-b+es+419/strings.xml b/app/src/main/res/values-b+es+419/strings.xml index fb9b4c3c9..502f0234f 100644 --- a/app/src/main/res/values-b+es+419/strings.xml +++ b/app/src/main/res/values-b+es+419/strings.xml @@ -287,9 +287,6 @@ Auto pausa y reanuda al mostrarse. Nativo prepara Steam para la suspensión primero. Manual espera a Reanudar. Nunca sigue ejecutándose. Mantener las descargas activas Retrasa la suspensión en segundo plano mientras Steam esté descargando. - Compresión zRAM - Mientras se ejecuta un juego, la memoria del cliente de Steam se comprime en la zram del dispositivo, lo que deja más RAM para el juego. Se aplica la próxima vez que se inicie Steam. - No disponible: este dispositivo no tiene swap activo, o su kernel es anterior a la 5.4. Auto pausa en segundo plano y reanuda al mostrarse. Manual espera a Reanudar. Nunca sigue ejecutándose. Inicio Iniciar Steam con DroidDeck diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 52c09a015..6a2f7582a 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -287,9 +287,6 @@ Автоматично поставя на пауза и продължава, когато се покаже отново. Системно подготвя Steam за заспиване първо. Ръчно изчаква „Продължи“. Никога продължава да работи. Продължаване на изтеглянията Отлага фоновото спиране, докато Steam активно изтегля. - zRAM компресия - Докато играта работи, паметта на Steam клиента се компресира в zram на устройството, така че играта получава повече RAM. Важи при следващото стартиране на Steam. - Недостъпно: устройството няма zram или swap, или ядрото е по-старо от 5.4. Автоматично поставя на пауза във фонов режим и продължава при показване. Ръчно изчаква „Продължи“. Никога продължава да работи. Стартиране Стартиране на Steam заедно с DroidDeck diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 9df47991c..404304380 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -287,9 +287,6 @@ Automaticky pozastaví relaci a obnoví ji při zobrazení. Nativně nejprve připraví Steam na spánek. Manuálně čeká na Obnovit. Nikdy běh nezastavuje. Nechat stahování běžet Oddálí pozastavení na pozadí, pokud Steam aktivně stahuje. - Komprese zRAM - Během hraní se paměť klienta Steam komprimuje do zram zařízení, takže hra má víc RAM. Platí při příštím spuštění Steamu. - Není k dispozici: zařízení nemá zram ani swap, nebo je jádro starší než 5.4. Automaticky pozastaví na pozadí a obnoví při zobrazení. Manuálně čeká na Obnovit. Nikdy běh nezastavuje. Spouštění Spustit Steam s DroidDeck diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 6b200711d..e043f3ac2 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -287,9 +287,6 @@ Auto sætter på pause og genoptager, når den vises. Native forbereder Steam til dvale først. Manuel venter på Genoptag. Aldrig fortsætter med at køre. Fortsæt downloads Udskyder baggrundspause, mens Steam aktivt downloader. - zRAM-komprimering - Mens et spil kører, komprimeres Steam-klientens hukommelse til enhedens zram, så spillet får mere RAM. Gælder næste gang Steam starter. - Ikke tilgængeligt: enheden har ingen zram eller swap, eller kernen er ældre end 5.4. Auto sætter på pause i baggrunden og genoptager, når den vises. Manuel venter på Genoptag. Aldrig fortsætter med at køre. Opstart Start Steam med DroidDeck diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index d284aa127..6615713b1 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -2520,9 +2520,6 @@ Komplettierer %1$s Std. %1$d Min. - zRAM-Komprimierung - Während ein Spiel läuft, wird der Arbeitsspeicher des Steam-Clients in das zram des Geräts komprimiert, sodass mehr RAM für das Spiel bleibt. Wird beim nächsten Start von Steam angewendet. - Nicht verfügbar: Dieses Gerät hat kein zram oder keinen Swap, oder sein Kernel ist älter als 5.4. Alle Einstellungen zurücksetzen Alle Einstellungen zurücksetzen? Anzeige-, Leistungs-, Controller-, Design-, Sprach- und Launcher-Einstellungen werden auf ihre Standardwerte zurückgesetzt. Deine Spiele, die Steam-Anmeldung, Shop-Konten, heruntergeladene Treiber und Speicherordner bleiben erhalten. diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 409cda9ec..84f49be0c 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -287,9 +287,6 @@ Το Αυτόματο θέτει σε παύση και συνεχίζει όταν εμφανίζεται. Το Εγγενής προετοιμάζει πρώτα το Steam για αδρανοποίηση. Το Μη αυτόματο περιμένει το Συνέχιση. Το Ποτέ συνεχίζει να εκτελείται. Διατήρηση των λήψεων σε εξέλιξη Καθυστερεί την αναστολή παρασκηνίου όσο το Steam κάνει ενεργά λήψη. - Συμπίεση zRAM - Όσο τρέχει ένα παιχνίδι, η μνήμη του Steam συμπιέζεται στο zram της συσκευής, ώστε το παιχνίδι να έχει περισσότερη RAM. Ισχύει την επόμενη φορά που θα ξεκινήσει το Steam. - Μη διαθέσιμο: η συσκευή δεν έχει zram ή swap, ή ο πυρήνας είναι παλαιότερος από 5.4. Το Αυτόματο θέτει σε παύση στο παρασκήνιο και συνεχίζει όταν εμφανίζεται. Το Μη αυτόματο περιμένει το Συνέχιση. Το Ποτέ συνεχίζει να εκτελείται. Εκκίνηση Εκκίνηση του Steam με το DroidDeck diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 85e1bf0a4..92a895720 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -2555,9 +2555,6 @@ Lo usa el cliente de Steam x86-64 Esta copia está en el cliente de Steam x86-64. Elige x86-64 en Cliente de Steam y desinstálala aquí. Esta copia está en el cliente de Steam ARM64. Elige ARM64 en Cliente de Steam y desinstálala aquí. - Compresión zRAM - Mientras se ejecuta un juego, la memoria del cliente de Steam se comprime en la zram del dispositivo, lo que deja más RAM para el juego. Se aplica la próxima vez que se inicie Steam. - No disponible: este dispositivo no tiene swap activo, o su kernel es anterior a la 5.4. No hay suficiente espacio libre: se necesitan %1$s y solo hay %2$s libres Espacio insuficiente (%1$s libres, se necesitan %2$s) Espacio libre desconocido diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index b6757f5e7..84b55022f 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -287,9 +287,6 @@ Automaattinen keskeyttää ja jatkaa, kun sovellus tulee näkyviin. Natiivi valmistelee Steamin lepotilaan ensin. Manuaalinen odottaa Jatka-painiketta. Ei koskaan pitää sovelluksen aina käynnissä. Pidä lataukset käynnissä Viivästytä taustakeskeytystä, kun Steam lataa aktiivisesti. - zRAM-pakkaus - Pelin pyöriessä Steam-asiakkaan muisti pakataan laitteen zramiin, jolloin pelille jää enemmän RAM-muistia. Astuu voimaan, kun Steam käynnistetään seuraavan kerran. - Ei käytettävissä: laitteessa ei ole zramia tai swappia, tai ydin on vanhempi kuin 5.4. Automaattinen keskeyttää taustalla ja jatkaa, kun sovellus tulee näkyviin. Manuaalinen odottaa Jatka-painiketta. Ei koskaan pitää sovelluksen aina käynnissä. Käynnistys Käynnistä Steam DroidDeckin kanssa diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index af743337c..c89604d26 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -2555,9 +2555,6 @@ Télécharger des composants Les téléchargements sont partagés avec la page « Composants ». Choisissez une version téléchargée ci-dessus pour l\'utiliser au prochain lancement du jeu. Choisissez une version à télécharger - Compression zRAM - Pendant qu\'un jeu tourne, la mémoire du client Steam est compressée dans la zram de l\'appareil, ce qui laisse plus de RAM au jeu. S\'applique au prochain démarrage de Steam. - Indisponible : cet appareil n\'a pas de swap actif, ou son noyau est antérieur à la version 5.4. Espace libre insuffisant : %1$s nécessaires, seulement %2$s libres Espace insuffisant (%1$s libres, %2$s nécessaires) Espace libre inconnu diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 38eac1193..2dff496b2 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -287,9 +287,6 @@ ऑटो दिखने पर रुकता है और फिर से शुरू होता है। नेटिव पहले Steam को स्लीप के लिए तैयार करता है। मैनुअल फिर से शुरू करें का इंतज़ार करता है। कभी नहीं वाला चलता रहता है। डाउनलोड चलते रहने दें Steam के सक्रिय रूप से डाउनलोड करते समय बैकग्राउंड सस्पेंशन को टालें। - zRAM कम्प्रेशन - गेम चलने के दौरान Steam क्लाइंट की मेमोरी डिवाइस के zram में कम्प्रेस होती है, जिससे गेम को ज़्यादा RAM मिलती है। अगली बार Steam शुरू होने पर लागू होगा। - उपलब्ध नहीं: इस डिवाइस में zram या swap नहीं है, या कर्नेल 5.4 से पुराना है। ऑटो बैकग्राउंड में रुकता है और दिखने पर फिर से शुरू होता है। मैनुअल फिर से शुरू करें का इंतज़ार करता है। कभी नहीं वाला चलता रहता है। स्टार्टअप DroidDeck के साथ Steam शुरू करें diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index a307b5aed..e3edb7ef4 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -287,9 +287,6 @@ Az Automatikus szüneteltet, és megjelenéskor folytatja. A Natív előbb felkészíti a Steamet az altatásra. A Manuális megvárja a Folytatást. A Soha mindig futva tartja. Letöltések futtatásának fenntartása Elhalasztja a háttérbeli felfüggesztést, amíg a Steam aktívan letölt. - zRAM-tömörítés - Játék közben a Steam kliens memóriája a készülék zramjába tömörül, így a játéknak több RAM jut. A Steam következő indításakor lép életbe. - Nem elérhető: a készüléken nincs zram vagy swap, vagy a kernel régebbi az 5.4-nél. Az Automatikus szüneteltet a háttérben, és megjelenéskor folytatja. A Manuális megvárja a Folytatást. A Soha mindig futva tartja. Indítás Steam indítása a DroidDeckkel diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index f1cbe9543..8d3e41a1d 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -287,9 +287,6 @@ Otomatis menjeda dan melanjutkan saat ditampilkan. Native menyiapkan Steam untuk tidur terlebih dahulu. Manual menunggu Lanjutkan. Tidak pernah terus berjalan. Pertahankan unduhan tetap berjalan Menunda penjedaan latar belakang saat Steam sedang aktif mengunduh. - Kompresi zRAM - Saat bermain, memori klien Steam dipadatkan ke zram perangkat sehingga gim mendapat lebih banyak RAM. Berlaku saat Steam dijalankan berikutnya. - Tidak tersedia: perangkat ini tidak punya zram atau swap, atau kernelnya lebih lama dari 5.4. Otomatis menjeda di latar belakang dan melanjutkan saat ditampilkan. Manual menunggu Lanjutkan. Tidak pernah terus berjalan. Mulai Mulai Steam bersama DroidDeck diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 9493ae1b1..de3de5b33 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -2545,9 +2545,6 @@ Completista %1$s h %1$d min - Compressione zRAM - Mentre un gioco è in esecuzione, la memoria del client Steam viene compressa nella zram del dispositivo, lasciando più RAM al gioco. Si applica al prossimo avvio di Steam. - Non disponibile: questo dispositivo non ha zram o swap, oppure il suo kernel è precedente alla 5.4. Ripristina tutte le impostazioni Ripristinare tutte le impostazioni? Le impostazioni di schermo, prestazioni, controller, tema, lingua e launcher tornano ai valori predefiniti. Giochi, accesso a Steam, account degli store, driver scaricati e cartelle di archiviazione vengono mantenuti. diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 143351f82..d18f60b92 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -287,9 +287,6 @@ 自動では一時停止し、表示すると再開します。ネイティブでは先にSteamをスリープに備えさせます。手動では「再開」をタップするまで待機します。「しない」では実行し続けます。 ダウンロードを継続 Steamがダウンロード中は、バックグラウンドでの一時停止を遅らせます。 - zRAM 圧縮 - ゲームの実行中、Steam クライアントのメモリがデバイスの zram に圧縮され、ゲーム用のメモリが増えます。次回 Steam を起動したときに反映されます。 - 使用できません:このデバイスに zram もしくは swap がないか、カーネルが 5.4 未満です。 自動ではバックグラウンドで一時停止し、表示すると再開します。手動では「再開」をタップするまで待機します。「しない」では実行し続けます。 起動 DroidDeck起動時にSteamを起動 diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 901a84e7d..647212802 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -287,9 +287,6 @@ 자동: 일시 중지되고 다시 표시되면 재개됩니다. 네이티브: 먼저 Steam을 절전에 대비시킵니다. 수동: \"재개\"를 탭할 때까지 기다립니다. 안 함: 계속 실행됩니다. 다운로드 계속 진행 Steam이 다운로드 중일 때는 백그라운드 일시 중지를 미룹니다. - zRAM 압축 - 게임을 실행하는 동안 Steam 클라이언트의 메모리가 기기의 zram으로 압축되어 게임에 더 많은 메모리가 남습니다. 다음에 Steam을 시작할 때 적용됩니다. - 사용할 수 없음: 이 기기에 zram 또는 swap이 없거나 커널이 5.4 미만입니다. 자동: 백그라운드에서 일시 중지되고 다시 표시되면 재개됩니다. 수동: \"재개\"를 탭할 때까지 기다립니다. 안 함: 계속 실행됩니다. 시작 DroidDeck을 열 때 Steam 시작 diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index 6c5acab20..c9962a55f 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -287,9 +287,6 @@ Auto menjeda dan menyambung semula apabila dipaparkan. Asli menyediakan Steam untuk tidur dahulu. Manual menunggu Sambung. Jangan sekali-kali terus berjalan. Teruskan muat turun Lambatkan penjedaan latar belakang semasa Steam aktif memuat turun. - Pemampatan zRAM - Semasa bermain, memori klien Steam dimampatkan ke zram peranti supaya permainan mendapat lebih RAM. Berkuat kuasa pada permulaan Steam seterusnya. - Tidak tersedia: peranti ini tiada zram atau swap, atau kernelnya lebih lama daripada 5.4. Auto menjeda di latar belakang dan menyambung semula apabila dipaparkan. Manual menunggu Sambung. Jangan sekali-kali terus berjalan. Permulaan Mulakan Steam bersama DroidDeck diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 6bbab5819..c870a048e 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -287,9 +287,6 @@ Auto setter på pause og gjenopptar når den vises. Nativ forbereder Steam på hvilemodus først. Manuell venter på Gjenoppta. Aldri lar den fortsette å kjøre. La nedlastinger fortsette Utsetter bakgrunnspause mens Steam laster aktivt ned. - zRAM-komprimering - Mens et spill kjører, komprimeres minnet til Steam-klienten til enhetens zram, slik at spillet får mer RAM. Gjelder neste gang Steam starter. - Ikke tilgjengelig: enheten har ingen zram eller swap, eller kjernen er eldre enn 5.4. Auto setter på pause i bakgrunnen og gjenopptar når den vises. Manuell venter på Gjenoppta. Aldri lar den fortsette å kjøre. Oppstart Start Steam med DroidDeck diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 12400b3e8..dc3e6c42c 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -287,9 +287,6 @@ Automatisch pauzeert en hervat zodra de app weer zichtbaar is. Systeemeigen maakt Steam eerst klaar voor de slaapstand. Handmatig wacht op Hervatten. Nooit laat alles doorlopen. Downloads laten doorlopen Stel onderbreken op de achtergrond uit zolang Steam actief downloadt. - zRAM-compressie - Terwijl een game draait wordt het geheugen van de Steam-client gecomprimeerd naar de zram van het apparaat, zodat de game meer RAM heeft. Geldt de volgende keer dat Steam start. - Niet beschikbaar: dit apparaat heeft geen zram of swap, of de kernel is ouder dan 5.4. Automatisch pauzeert op de achtergrond en hervat zodra de app weer zichtbaar is. Handmatig wacht op Hervatten. Nooit laat alles doorlopen. Opstarten Steam starten met DroidDeck diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index d80cd8cec..666a47b29 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -287,9 +287,6 @@ „Auto” wstrzymuje i wznawia po powrocie. „Natywnie” najpierw przygotowuje Steam do uśpienia. „Ręcznie” czeka na „Wznów”. „Nigdy” nie przerywa działania. Nie przerywaj pobierania Opóźnia wstrzymanie w tle, gdy Steam aktywnie pobiera. - Kompresja zRAM - Gdy gra działa, pamięć klienta Steam jest kompresowana do zram urządzenia, więc gra ma więcej RAM-u. Zadziała przy następnym uruchomieniu Steam. - Niedostępne: to urządzenie nie ma zram ani swapu, albo jądro jest starsze niż 5.4. „Auto” wstrzymuje w tle i wznawia po powrocie. „Ręcznie” czeka na „Wznów”. „Nigdy” nie przerywa działania. Uruchamianie Uruchamiaj Steam z DroidDeck diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index fed2cf78e..1ef3830ae 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -2553,9 +2553,6 @@ Repor Repor também os perfis de jogo (Proton, FEX, componentes e ambiente de cada jogo e o ambiente do perfil Padrão) Termine a sessão antes de repor as definições. - Compressão zRAM - Indisponível: este dispositivo não tem swap ativo ou o kernel é anterior à versão 5.4. - Enquanto um jogo está a correr, a memória do cliente Steam é comprimida na zram do dispositivo, deixando mais RAM para o jogo. Aplica-se a partir da próxima vez que o Steam iniciar. Espaço insuficiente (%1$s livres, são necessários %2$s) Espaço livre insuficiente: são necessários %1$s, só há %2$s livres Espaço livre desconhecido diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 37559d301..9ef9a8606 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -2545,9 +2545,6 @@ Completista %1$s h %1$d min - Compressão zRAM - Enquanto um jogo roda, a memória do cliente Steam é comprimida na zram do dispositivo, deixando mais RAM para o jogo. Vale a partir da próxima vez que a Steam iniciar. - Indisponível: este dispositivo não tem swap ativo, ou o kernel é anterior à versão 5.4. Redefinir todas as configurações Redefinir todas as configurações? As configurações de tela, desempenho, controle, tema, idioma e inicializador voltam ao padrão. Seus jogos, o login da Steam, as contas das lojas, os drivers baixados e as pastas de armazenamento são mantidos. diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 5ddf3f0a5..a70b63efc 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -287,9 +287,6 @@ Automat pune pe pauză și reia atunci când este afișată. Nativ pregătește Steam pentru repaus mai întâi. Manual așteaptă Reluare. Niciodată continuă să ruleze. Continuă descărcările Întârzie suspendarea în fundal cât timp Steam descarcă activ. - Compresie zRAM - În timpul jocului, memoria clientului Steam este comprimată în zram-ul dispozitivului, astfel încât jocul primește mai mult RAM. Se aplică la următoarea pornire a Steam. - Indisponibil: dispozitivul nu are zram sau swap, ori kernelul e mai vechi decât 5.4. Automat pune pe pauză în fundal și reia atunci când este afișată. Manual așteaptă Reluare. Niciodată continuă să ruleze. Pornire Pornește Steam odată cu DroidDeck diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 83295afb9..bab62122f 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -2580,9 +2580,6 @@ Скачать компоненты Загрузки общие со страницей «Компоненты». Выберите выше скачанную версию, чтобы использовать её при следующем запуске игры. Выберите версию для скачивания - Сжатие zRAM - Пока идёт игра, память клиента Steam сжимается в zram устройства, и игре остаётся больше ОЗУ. Применяется при следующем запуске Steam. - Недоступно: на устройстве нет zram или swap, либо его ядро старше 5.4. Недостаточно свободного места: нужно %1$s, свободно только %2$s Недостаточно места (свободно %1$s, нужно %2$s) Свободное место неизвестно diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 3bab33523..8b9be87c2 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -287,9 +287,6 @@ Auto pausar och återupptar när den visas. Inbyggd förbereder Steam för vila först. Manuell väntar på Återuppta. Aldrig fortsätter köra. Håll nedladdningar igång Skjut upp bakgrundspausning medan Steam aktivt laddar ned. - zRAM-komprimering - Medan ett spel körs komprimeras Steam-klientens minne till enhetens zram så att spelet får mer RAM. Gäller nästa gång Steam startar. - Inte tillgängligt: enheten har ingen zram eller swap, eller så är kärnan äldre än 5.4. Auto pausar i bakgrunden och återupptar när den visas. Manuell väntar på Återuppta. Aldrig fortsätter köra. Uppstart Starta Steam med DroidDeck diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 621087784..648aff3f4 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -287,9 +287,6 @@ อัตโนมัติจะหยุดชั่วคราวและดำเนินการต่อเมื่อแสดงผล ดั้งเดิมเตรียม Steam เข้าสู่โหมดพักก่อน กำหนดเองรอการกดดำเนินการต่อ ไม่มีวันทำงานต่อเนื่องตลอด ให้การดาวน์โหลดทำงานต่อไป เลื่อนการหยุดพื้นหลังชั่วคราวออกไปขณะ Steam กำลังดาวน์โหลดอยู่ - การบีบอัด zRAM - ระหว่างเล่นเกม หน่วยความจำของไคลเอนต์ Steam จะถูกบีบอัดลง zram ของอุปกรณ์ ทำให้เกมได้ RAM มากขึ้น มีผลเมื่อเริ่ม Steam ครั้งถัดไป - ใช้ไม่ได้: อุปกรณ์นี้ไม่มี zram หรือ swap หรือเคอร์เนลเก่ากว่า 5.4 อัตโนมัติจะหยุดชั่วคราวเมื่ออยู่ในพื้นหลังและดำเนินการต่อเมื่อแสดงผล กำหนดเองรอการกดดำเนินการต่อ ไม่มีวันทำงานต่อเนื่องตลอด การเริ่มทำงาน เริ่ม Steam พร้อมกับ DroidDeck diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index a0e60d8c6..58cebb95e 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -2520,9 +2520,6 @@ Tamamlayıcı %1$s sa %1$d dk - zRAM sıkıştırma - Bir oyun çalışırken Steam istemcisinin belleği cihazın zram\'ına sıkıştırılır ve oyuna daha fazla RAM kalır. Steam\'in bir sonraki başlatılışında uygulanır. - Kullanılamıyor: bu cihazda zram veya swap yok ya da çekirdeği 5.4\'ten eski. Tüm ayarları sıfırla Tüm ayarlar sıfırlansın mı? Ekran, performans, denetleyici, tema, dil ve başlatıcı ayarları varsayılanlarına döner. Oyunlarınız, Steam oturum bilgileriniz, mağaza hesaplarınız, indirilen sürücüler ve depolama klasörleriniz korunur. diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 5bc3cd8f1..3f7cf70c2 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -287,9 +287,6 @@ «Авто» призупиняє сеанс і відновлює його, коли додаток знову на екрані. «Нативний» спершу готує Steam до сну. «Вручну» чекає на «Відновити». «Ніколи» — сеанс працює далі. Не переривати завантаження Відкладає призупинення у фоні, поки Steam активно щось завантажує. - Стиснення zRAM - Під час гри пам\'ять клієнта Steam стискається в zram пристрою, тож гра отримує більше RAM. Застосується під час наступного запуску Steam. - Недоступно: на пристрої немає zram або swap, чи ядро старіше за 5.4. «Авто» призупиняє сеанс у фоні й відновлює, коли додаток знову на екрані. «Вручну» чекає на «Відновити». «Ніколи» — сеанс працює далі. Запуск Запускати Steam разом із DroidDeck diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 874e91cd7..572d7e943 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -287,9 +287,6 @@ Tự động tạm dừng và tiếp tục khi được hiển thị lại. Gốc chuẩn bị Steam để ngủ trước. Thủ công chờ nhấn Tiếp tục. Không bao giờ giữ nó luôn chạy. Giữ tải xuống tiếp tục chạy Trì hoãn tạm dừng nền khi Steam đang tải xuống. - Nén zRAM - Khi chơi, bộ nhớ của ứng dụng Steam được nén vào zram của thiết bị để game có thêm RAM. Áp dụng từ lần khởi động Steam tiếp theo. - Không khả dụng: thiết bị không có zram hoặc swap, hoặc nhân cũ hơn 5.4. Tự động tạm dừng ở nền và tiếp tục khi hiển thị lại. Thủ công chờ nhấn Tiếp tục. Không bao giờ giữ nó luôn chạy. Khởi động Khởi động Steam cùng DroidDeck diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 960fdd825..aa0b89651 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -287,9 +287,6 @@ 自动会暂停并在显示时恢复。原生会先让 Steam 做好睡眠准备。手动会等待点按恢复。“从不”则保持运行。 后台继续下载 Steam 正在下载时推迟后台暂停。 - zRAM 压缩 - 游戏运行时,Steam 客户端的内存会压缩进设备的 zram,为游戏留出更多内存。下次启动 Steam 时生效。 - 不可用:此设备没有 zram 或 swap,或其内核低于 5.4。 自动会在后台暂停并在显示时恢复。手动会等待点按恢复。“从不”则保持运行。 启动 随 DroidDeck 启动 Steam diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 00c99dd55..78096f4b6 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -287,9 +287,6 @@ 「自動」會暫停,並在重新顯示時繼續;「原生」會先讓 Steam 準備好休眠;「手動」會等你按「繼續」;「從不」會保持執行。 保持下載進行 Steam 正在下載時,延遲在背景暫停。 - zRAM 壓縮 - 遊戲運行時,Steam 用戶端的記憶體會壓縮進裝置的 zram,為遊戲騰出更多記憶體。下次啟動 Steam 時生效。 - 無法使用:此裝置沒有 zram 或 swap,或核心版本低於 5.4。 「自動」會在背景時暫停,並在重新顯示時繼續;「手動」會等你按「繼續」;「從不」會保持執行。 啟動 隨 DroidDeck 啟動 Steam diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 941437a04..dd52624c5 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -287,9 +287,6 @@ 「自動」會暫停,並在重新顯示時繼續。「原生」會先讓 Steam 做好睡眠準備。「手動」會等你點擊「繼續」。「從不」則會持續執行。 讓下載持續進行 Steam 正在下載時,延後在背景暫停。 - zRAM 壓縮 - 遊戲執行時,Steam 用戶端記憶體會壓縮進裝置的 zram,為遊戲騰出更多記憶體。下次啟動 Steam 時生效。 - 無法使用:此裝置沒有 zram 或 swap,或核心版本低於 5.4。 「自動」會在背景時暫停,並在重新顯示時繼續。「手動」會等你點擊「繼續」。「從不」則會持續執行。 啟動 隨 DroidDeck 啟動 Steam diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f9bce6977..09f84d9b8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -292,9 +292,6 @@ Auto pauses and resumes when shown. Native prepares Steam for sleep first. Manual waits for Resume. Never keeps running. Keep downloads running Delay background suspension while Steam is actively downloading. - zRAM compression - While a game runs, the Steam client\'s memory is compressed into the device\'s zram, leaving more RAM for the game. Applies the next time Steam starts. - Unavailable: this device has no zram or swap, or its kernel is older than 5.4. Auto pauses in the background and resumes when shown. Manual waits for Resume. Never keeps running. Startup Start Steam with DroidDeck diff --git a/app/src/test/java/com/droiddeck/launcher/core/ZramSupportTest.kt b/app/src/test/java/com/droiddeck/launcher/core/ZramSupportTest.kt index 056e3a055..033efb578 100644 --- a/app/src/test/java/com/droiddeck/launcher/core/ZramSupportTest.kt +++ b/app/src/test/java/com/droiddeck/launcher/core/ZramSupportTest.kt @@ -14,20 +14,6 @@ class ZramSupportTest { assertFalse(ZramSupport.kernelAtLeast("", 5, 4)) } - @Test - fun underTwelveGbFromAdvertisedOrTotalMemory() { - val gb = 1_000_000_000L - val gib = 1L shl 30 - assertTrue(ZramSupport.belowTwelveGb(8 * gb, 0)) - assertTrue(ZramSupport.belowTwelveGb(8 * gib, 0)) - assertFalse(ZramSupport.belowTwelveGb(12 * gb, 0)) - assertFalse(ZramSupport.belowTwelveGb(12 * gib, 0)) - assertTrue(ZramSupport.belowTwelveGb(0, 7_400_000L * 1024)) - assertTrue(ZramSupport.belowTwelveGb(0, 9_300_000L * 1024)) - assertFalse(ZramSupport.belowTwelveGb(0, 11_100_000L * 1024)) - assertFalse(ZramSupport.belowTwelveGb(0, 15_600_380L * 1024)) - } - @Test fun swapTotalComesFromMeminfo() { assertEquals(12582908L, ZramSupport.swapTotalKb(listOf("MemTotal: 15600380 kB", "SwapTotal: 12582908 kB"))) diff --git a/app/src/test/java/com/droiddeck/launcher/session/SessionSuspendControllerTest.kt b/app/src/test/java/com/droiddeck/launcher/session/SessionSuspendControllerTest.kt index 61e95da49..b8eafcc1b 100644 --- a/app/src/test/java/com/droiddeck/launcher/session/SessionSuspendControllerTest.kt +++ b/app/src/test/java/com/droiddeck/launcher/session/SessionSuspendControllerTest.kt @@ -26,6 +26,30 @@ class SessionSuspendControllerTest { } } + @Test fun pageOutRunsInPreloadedGuestsBeforeTheyStop() { + val fixture = fixture(17) + fixture.control.writeText("0") + fixture.controller.freeze(pageOut = true) { assertTrue(it) } + val urgent = fixture.signals.filter { it.signal == URG } + assertEquals(listOf(GAME), urgent.map { it.pid }) + assertTrue(fixture.signals.indexOfFirst { it.signal == URG } < fixture.signals.indexOfFirst { it.signal == STOP }) + assertEquals("1", fixture.control.readText()) + assertEquals(listOf(Triple(1, 1_000_000L, 3_000_000L)), fixture.pagedOut) + assertTrue(fixture.game.threads.all { it.state == 't' }) + } + + @Test fun noPageOutWithoutTheRequestOrTheControlFile() { + val visible = fixture(17) + visible.control.writeText("0") + visible.controller.freeze { assertTrue(it) } + assertFalse(visible.signals.any { it.signal == URG }) + assertEquals("0", visible.control.readText()) + val disabled = fixture(17) + disabled.controller.freeze(pageOut = true) { assertTrue(it) } + assertFalse(disabled.signals.any { it.signal == URG }) + assertTrue(disabled.pagedOut.isEmpty()) + } + @Test fun cpuMustBeStableAcrossTwoCompleteSnapshots() { val fixture = fixture(17) var changes = 0 @@ -253,13 +277,13 @@ class SessionSuspendControllerTest { } private fun fixture(count: Int, executor: QueueExecutor = InlineExecutor()) = - Fixture(temporary.newFolder(), count, executor) + Fixture(temporary.newFolder(), temporary.newFolder(), count, executor) private data class Task(val tid: Int, var started: Long, var state: Char, var cpu: Long = 0) private data class Group(val pid: Int, var parent: Int, var tracer: Int, val threads: MutableList) private data class SentSignal(val pid: Int, val signal: Int) - private class Fixture(val proc: File, count: Int, executor: QueueExecutor) { + private class Fixture(val proc: File, tmp: File, count: Int, executor: QueueExecutor) { val root = Group(ROOT, 9000, 0, mutableListOf(Task(ROOT, 1000, 'S'))) val game = Group(GAME, ROOT, ROOT, MutableList(count) { Task(GAME + it, 2000L + it, 'S') }) val groups = mutableListOf(root, game) @@ -276,10 +300,17 @@ class SessionSuspendControllerTest { var emptyGameTasks = false var rootGone = false var afterSleep: (() -> Unit)? = null + val control = File(tmp, ".bl-zram") + val pagedOut = mutableListOf>() + private var gameResidentKb = 4_000_000L + private var gameSwapKb = 0L + private var pagingOut = false private var continuing = false val controller = SessionSuspendController( { rootPid }, { helpers }, { audioSuspends++ }, { audioResumes++ }, proc, ::signal, ::threadSignal, ::sleep, { now }, executor, + zramControl = control, + pagedOut = { processes, resident, swap, _, _ -> pagedOut += Triple(processes, resident, swap) }, ) init { sync() } @@ -293,6 +324,8 @@ class SessionSuspendControllerTest { else group.threads.firstOrNull { it.state !in listOf('T', 't', 'Z', 'X') && !(neverStop && it == game.threads.last()) }?.state = 't' + } else if (signal == URG) { + pagingOut = true } else if (signal == CONT) { continuing = true if (!(pid == GAME && blockGameContinue)) group.threads.forEach { if (it.state != 'Z') it.state = 'S' } @@ -311,6 +344,10 @@ class SessionSuspendControllerTest { private fun sleep(millis: Long) { now += millis + if (pagingOut && gameResidentKb > 1_000_000L) { + gameResidentKb -= 1_000_000L + gameSwapKb += 1_000_000L + } if (root.threads.first().state != 'T' && !continuing) game.threads.forEach { if (it.state != 'Z') { it.state = 'S'; it.cpu++ } } @@ -326,7 +363,11 @@ class SessionSuspendControllerTest { val stat = File(dir, "stat") if (group == game && missingGameStat) stat.delete() else stat.writeText(stat(group, group.threads.first())) - File(dir, "status").writeText("TracerPid: ${group.tracer}\n") + File(dir, "status").writeText( + "TracerPid: ${group.tracer}\n" + + if (group == game) "VmRSS:\t$gameResidentKb kB\nVmSwap:\t$gameSwapKb kB\n" else "", + ) + if (group == game) File(dir, "maps").writeText("7f00000000-7f00001000 r-xp 00000000 fe:05 42 /usr/local/lib/libblsession.so\n") val taskDir = File(dir, "task") if (group == game && missingGameTasks) { taskDir.deleteRecursively(); continue } taskDir.mkdirs() @@ -375,5 +416,6 @@ class SessionSuspendControllerTest { const val GAME = 200 const val STOP = 19 const val CONT = 18 + const val URG = 23 } } diff --git a/tools/linuxfs/overlay/usr/local/bin/droiddeck-session b/tools/linuxfs/overlay/usr/local/bin/droiddeck-session index 39ee3c8a6..467aa0fdc 100755 --- a/tools/linuxfs/overlay/usr/local/bin/droiddeck-session +++ b/tools/linuxfs/overlay/usr/local/bin/droiddeck-session @@ -60,6 +60,9 @@ clear_stale_tmp() { return 0 } [ -z "${BL_INSIDE:-}" ] && clear_stale_tmp +if [ -z "${BL_INSIDE:-}" ]; then + if [ "${BL_ZRAM:-0}" = 1 ]; then printf 0 > /tmp/.bl-zram; else rm -f /tmp/.bl-zram; fi +fi steam_update_stuck() { [ "$1" -lt 60 ] || steam_updates=0 @@ -441,7 +444,6 @@ case $mode in step "client cores: $BL_CLIENT_CPUS" fi if [ "${BL_ZRAM:-0}" = 1 ]; then - printf 0 > /tmp/.bl-zram step "zRAM compression: on" ( bl_zram_scan() { @@ -490,8 +492,6 @@ case $mode in nap 5 done ) & - else - rm -f /tmp/.bl-zram fi if [ "${BL_LAUNCHER_CORES:-1}" != 0 ] && [ -n "${BL_LAUNCH_DIR:-}" ] && [ -z "${BL_DESKTOP:-}" ] \ && [ "${BL_STEAM_UI:-}" != desktop ] && [ -x /usr/local/bin/droiddeck-launcher-cores ]; then diff --git a/tools/linuxfs/preload/zram.c b/tools/linuxfs/preload/zram.c index 565e0f7dd..f5e09cf48 100644 --- a/tools/linuxfs/preload/zram.c +++ b/tools/linuxfs/preload/zram.c @@ -148,8 +148,6 @@ static void zr_child(void) { } __attribute__((constructor)) static void zr_init(void) { - const char *name = program_invocation_short_name; - if (strcmp(name, "steam") != 0 && strcmp(name, "steamwebhelper") != 0) return; void *libc = dlopen("libc.so.6", RTLD_LAZY | RTLD_NOLOAD); if (libc == NULL) return; zr_sys = (long (*)(long, ...))dlsym(libc, "syscall");