Wird die App kurz minimiert, um eine Benachrichtigung zu lesen, pausiert das OS sie nach einigen Sekunden (Suspend). In dieser Zeit trennt der Server die Verbindung des Spielers.
Warum Spiel wird für eine Nachricht oder einen Anruf in den Hintergrund geschickt → Folge Engine hält das Spielgeschehen an, kurz darauf pausiert das OS auch App und Netzwerk → Auf dem Bildschirm Bei der Rückkehr ist die Verbindung schon abgebrochen, Reconnect
Client: bei der Rückkehr sofort per Session-Token automatisch neu verbinden (Session ohne erneuten Login fortsetzen), ohne auf die abgebrochene Verbindung zu warten, den aktuellen Zustand in einem Schritt abholen und abgleichen. Server: bei ausbleibendem Heartbeat die Verbindung aufräumen, die Charakter-Session aber für eine kurze Karenzzeit halten (nicht sofort entfernen), bei Reconnect innerhalb dieser Zeit per Session-Token fortsetzen.
Größenordnungen
Spiel-Engines halten meist sofort beim Minimieren an. iOS pausiert die App nach einigen Sekunden, mit zusätzlich angeforderter Zeit meist innerhalb einiger Dutzend Sekunden. Ab Android 14 werden Apps, die nicht mehr im Vordergrund sind, nach etwa 10 s eingefroren.
Im Graphen
Verbindungen brechen gleichzeitig ab · Anzahl der Abbrüche (Heartbeat-Timeout), Einträge zum Pausieren der App
Wo nachsehen
Zeitpunkte von App-Pause und Rückkehr im Client-Log (in Unity OnApplicationPause) über die Session-ID mit Grund und Zeitpunkt der Trennung auf dem Server abgleichen. Unter Android auch die in ApplicationExitInfo hinterlegten Beendigungsgründe des Prozesses (etwa REASON_LOW_MEMORY) prüfen
Spricht dafür
Kurz vor der Trennung wegen Heartbeat-Timeout auf dem Server ging der Client in die Pause, direkt nach der Rückkehr verbindet er sich neu
Spricht dagegen
Verbindung brach ab, während die App im Vordergrund war: „Ablauf des NAT-Mappings“, „Geteilte Provider-IP (CGNAT)“, „Wechsel WLAN ↔ LTE/5G“
Prüfmittel
Logs oder Metriken aus Spielserver bzw. Client nötig
Mehr dazu
Bei Speichermangel beenden Smartphones minimierte Spiele mitunter ganz. Deshalb startet das Spiel nach einem Abstecher in die Kamera oder in eine Zahlungs- oder Authentifizierungs-App von vorn. Je schwächer das Gerät, desto häufiger passiert das.
Quellen
Extending your app’s background execution timeApple Beim Wechsel in den Hintergrund bleiben applicationDidEnterBackground 5 s, danach wird pausiert. Mehr Zeit lässt sich mit beginBackgroundTask anfordern (Restzeit in backgroundTimeRemaining)
Cached apps freezerAndroid (Google) Ab Android 14 werden App-Prozesse im Cached-Zustand nach 10 s eingefroren, dann stehen alle Threads still
Application.runInBackgroundUnity Standardwert false, die App hält im Hintergrund an. Android hält im Hintergrund unabhängig von der Einstellung an, iOS ignoriert die Einstellung
ApplicationExitInfoAndroid (Google) REASON_LOW_MEMORY: Der Low Memory Killer des Systems hat den App-Prozess beendet (Geräte ohne Unterstützung melden REASON_SIGNALED bzw. SIGKILL)