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

게임 렉 백서 › L2 클라이언트 OS·기기

모바일 앱 백그라운드 전환 App suspended in background

원인 ID co-mobile-bg · 주 담당 게임개발팀·클라이언트 개발 · 함께 게임개발팀·서버 개발

그림과 실험이 있는 원본 카드로 열기 →

알림을 보려고 앱을 잠깐 내리면 OS가 몇 초 뒤 앱을 일시 정지(suspend)하고, 그동안 서버는 나를 끊습니다.

왜 메시지 확인·전화로 게임을 내림 → 그러면 게임 엔진이 게임 진행을 멈추고 OS도 곧 앱과 네트워크를 정지시킴 → 화면에서는 돌아오면 이미 접속 끊김, 재접속

증상
접속 끊김
요인
정체, 손실
누가 겪나
나만
언제
가만히 있다가, 특정 행동을 할 때
담당
주 담당 게임개발팀·클라이언트 개발 · 함께 게임개발팀·서버 개발
게임개발팀 할 일
클라이언트: 돌아오면 끊긴 연결을 기다리지 말고 세션 토큰으로 바로 자동 재접속(재로그인 없이 이어 붙이기), 최신 상태를 한 번에 받아 맞추기. 서버: 하트비트가 끊기면 연결은 정리하되 캐릭터 세션은 짧은 유예 시간 동안 유지(바로 내보내지 않기), 그 안에 재접속하면 세션 토큰으로 이어 받기.
수치 감각
게임 엔진은 보통 내리는 순간 멈춥니다. iOS는 몇 초, 추가 시간을 받아도 대개 수십 초 안에 앱을 일시 정지하고 안드로이드 14 이상은 화면에서 내려간 앱을 10초쯤 뒤 동결(freeze)합니다.
그래프에서는
연결이 한꺼번에 끊김 · 끊김 수(하트비트 타임아웃), 앱 일시 정지 기록
확인할 곳
클라이언트 로그의 앱 일시 정지·복귀 시각(유니티는 OnApplicationPause)과 서버의 끊김 사유·시각을 세션 ID로 맞춰 봄. 안드로이드는 ApplicationExitInfo에 남은 프로세스 종료 사유(REASON_LOW_MEMORY 등)도 함께 봄
이러면 맞음
서버의 하트비트 타임아웃 끊김 직전에 클라이언트가 일시 정지로 들어갔고 복귀 직후 재접속함
이러면 아님
앱을 앞에 띄워 둔 동안 끊겼다면 “NAT 매핑 만료”, “통신사 공유 IP (CGNAT)”, “와이파이 ↔ LTE·5G 전환”
확인 수단
게임 서버·클라이언트의 로그·지표가 필요
더 알아보기
폰은 메모리가 모자라면 내려 둔 게임을 아예 종료하기도 합니다. 카메라나 결제·인증 앱을 다녀오면 게임이 처음부터 다시 켜지는 것도 이 때문입니다. 저사양 기기일수록 흔합니다.

출처

  1. Extending your app’s background execution time Apple
    백그라운드로 가면 applicationDidEnterBackground에 5초가 주어지고 곧 일시 정지, 더 필요하면 beginBackgroundTask로 시간을 요청(남은 시간은 backgroundTimeRemaining)
  2. Cached apps freezer Android (Google)
    안드로이드 14 이상은 캐시 상태가 된 앱 프로세스를 10초 뒤 동결, 동결되면 모든 스레드가 멈춤
  3. Application.runInBackground Unity
    기본값 false로 백그라운드에서 멈춤, 안드로이드는 백그라운드면 설정과 관계없이 멈추고 iOS는 이 설정을 무시
  4. MonoBehaviour.OnApplicationPause(bool) Unity
    앱이 일시 정지되거나 다시 실행될 때 모든 MonoBehaviour에 OnApplicationPause(true/false)를 보냄
  5. ApplicationExitInfo Android (Google)
    REASON_LOW_MEMORY: 시스템의 저메모리 킬러가 앱 프로세스를 종료함(지원하지 않는 기기는 REASON_SIGNALED·SIGKILL로 보고)

함께 보면 좋은 원인

같은 층: L2 클라이언트 OS·기기

같은 증상(접속 끊김)의 다른 층 원인

그림과 실험이 있는 원본 카드 보기