한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Анатомия игровых лагов › L2 ОС и устройство клиента

Сворачивание мобильного приложения в фон App suspended in background

ID причины co-mobile-bg · Основной ответственный Команда разработки · Разработка клиента · Совместно Команда разработки · Разработка сервера

Открыть карточку в основной версии с иллюстрациями и экспериментами →

Если ненадолго свернуть игру, чтобы посмотреть уведомление, через несколько секунд ОС приостанавливает приложение (suspend), а сервер тем временем отключает игрока.

Почему Игру свернули, чтобы прочитать сообщение или ответить на звонок → Следствие Движок останавливает игровой цикл, а вскоре ОС приостанавливает и само приложение, и его сетевую активность → На экране По возвращении уже дисконнект и переподключение

Симптомы
Дисконнект
Факторы
Остановка, Потери
У кого
Только у меня
Когда
После бездействия, При определённом действии
Ответственные
Основной ответственный Команда разработки · Разработка клиента · Совместно Команда разработки · Разработка сервера
Команда разработки: задачи
Клиент: по возвращении сразу автоматически переподключаться по токену сессии, не дожидаясь старого соединения (продолжать без повторного входа), и разом получать актуальное состояние. Сервер: когда хартбиты прекращаются, закрывать соединение, но ещё недолго сохранять сессию персонажа (окно переподключения, без немедленного кика) и при переподключении в это окно подхватывать её по токену сессии.
Цифры для ориентира
Движок обычно останавливается в момент сворачивания. iOS приостанавливает приложение через несколько секунд, а если оно запросило дополнительное время, обычно в пределах десятков секунд. Android 14 и новее замораживает (freeze) ушедшее с экрана приложение примерно через 10 секунд.
На графике
Массовый обрыв соединений · число обрывов (таймаут хартбита), записи о приостановке приложения
Где смотреть
Сопоставить по ID сессии время приостановки и возврата приложения из лога клиента (в Unity OnApplicationPause) с причиной и временем обрыва на сервере. На Android смотреть также причину завершения процесса в ApplicationExitInfo (REASON_LOW_MEMORY и др.)
Подтверждает
Незадолго до обрыва по таймауту хартбита на сервере клиент ушёл в приостановку, а сразу после возврата переподключился
Опровергает
Если обрыв случился, пока приложение было на экране, это «Истечение записи в таблице NAT», «Общий IP провайдера (CGNAT)» или «Переключение Wi-Fi ↔ LTE/5G»
Чем проверить
Нужны логи и метрики игрового сервера или клиента
Подробнее
Если памяти не хватает, телефон может и вовсе завершить свёрнутую игру. Поэтому после перехода в камеру, приложение для оплаты или авторизации игра запускается заново. На слабых устройствах это бывает чаще.

Источники

  1. Extending your app’s background execution time Apple
    При уходе в фон на applicationDidEnterBackground даётся 5 секунд, затем приложение приостанавливается. Если нужно больше, время запрашивают через beginBackgroundTask (остаток виден в backgroundTimeRemaining)
  2. Cached apps freezer Android (Google)
    Android 14 и новее замораживает процесс приложения, перешедший в кэшированное состояние, через 10 секунд. После заморозки все потоки стоят
  3. Application.runInBackground Unity
    По умолчанию false, и в фоне игра останавливается. На Android игра в фоне останавливается при любой настройке, iOS эту настройку игнорирует
  4. MonoBehaviour.OnApplicationPause(bool) Unity
    При приостановке и возобновлении приложения всем MonoBehaviour отправляется OnApplicationPause(true/false)
  5. ApplicationExitInfo Android (Google)
    REASON_LOW_MEMORY: процесс приложения завершён системным low memory killer (устройства без поддержки сообщают REASON_SIGNALED и SIGKILL)

Смотрите также

Тот же слой: L2 ОС и устройство клиента

Причины с тем же симптомом (Дисконнект) на других слоях

Карточка в основной версии с иллюстрациями и экспериментами