> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# XBOX 게임 수명 주기

> 게임 수명 주기 이벤트의 상태, 전환 및 처리와, 이를 디버그하는 데 사용할 수 있는 도구에 대한 세부 정보를 제공합니다.

# XBOX 게임 수명 주기

이 항목에서는 게임 수명 주기를 구성하는 개념과 이벤트를 소개합니다. 사용자에게 유연한 경험을 제공하기 위해 게임에서 게임 상태 및 상태 변경 이벤트를 구현하는 방법을 보여줍니다. 또한 인증 요구사항을 통과하는 방법을 보여주고, 이러한 이벤트를 디버깅하는 데 사용할 수 있는 도구와 기능을 소개합니다.

Microsoft Game Development Kit(GDK) 게임은 수명 동안 다양한 리소스 상태 사이를 전환합니다. 이러한 상태 간 전환을 통해 XBOX 콘솔은 사용자가 기대하는 반응형 멀티태스킹 경험을 제공할 수 있습니다. 또한 사용자가 게임을 플레이할 때 게임이 콘솔에서 가능한 최대 리소스를 얻도록 보장합니다. 그러나 이를 달성하려면 Microsoft Game Development Kit(GDK) 게임이 처리할 수 있도록 준비되어야 하는 몇 가지 이벤트 및 상호작용이 있습니다.

<br />

[소개](#introduction)

[게임 수명 주기 상태](#game-life-cycle-states)

[수명 주기 상태 전환](#life-cycle-state-transitions)

[수명 주기 이벤트 콜백](#life-cycle-event-callbacks)

[Suspend 및 Resume에 응답하기](#responding-to-suspend-and-resume)

[Constrain 및 Unconstrain에 응답하기](#responding-to-constrain-and-unconstrain)

[실행](#launching)

[수명 주기와 관련된 이벤트](#events-related-to-life-cycle)

[GDK 시간 초과 작업](#timeouts)

[Quick Resume](#quick-resume)

[디버깅 도구 및 기능](#debugging-tools-and-features)

[부록](#appendix)

<br />

<a id="introduction" />

## 소개

게임 수명 주기 상태와 이벤트를 통해 사용자는 게임, XBOX 셸, 기타 앱 사이를 빠르고 효율적으로 전환할 수 있습니다. 이 프로세스에서는 게임과 앱이 수명 주기 상태 간 전환을 처리할 수 있도록 몇 가지 동작을 수행해야 합니다. 잘 처리되면, 사용자가 게임을 오가는 동안 부드럽고 매끄러운 경험을 제공합니다. 이 항목에서는 게임의 수명 주기를 관리하는 다양한 측면을 설명하고 이러한 측면을 지원하는 사용 가능한 도구를 설명합니다. XBOX One Software Development Kit 또는 Universal Windows Platform(UWP) 애플리케이션의 프로세스 수명 관리(PLM)에 익숙하다면 이 정보가 익숙할 것입니다. GDK 애플리케이션에 몇 가지 주요 차이점과 개선사항이 있음을 유의하십시오.

이 항목은 다음으로 시작합니다:

* 다양한 수명 주기 상태에 대한 논의.
* 그들 간의 전환.
* 그와 연관된 콜백.

다음으로, 이 항목에서는 XBOX 요구사항(XR)을 통과하기 위해 이러한 전환을 성공적으로 처리하기 위한 요구사항을 설명하고 대부분의 게임이 고려해야 할 일반적인 사용 사례에 대해 논의합니다.

마지막으로, 이 항목에서는 상태 전환 문제를 더 쉽게 이해하고 수정할 수 있는 도구와 디버깅 기능을 소개합니다.

<br />

<a id="game-life-cycle-states" />

## 게임 수명 주기 상태

XBOX 콘솔에 설치된 Microsoft Game Development Kit(GDK) 게임은 항상 다음 다섯 가지 가능한 상태 중 하나에 있습니다.

1. Running
2. Constrained
3. Suspending
4. Suspended
5. Not Running

다음을 확인하여 게임의 상태를 확인할 수 있습니다:

* [XBOX Manager](/ko/tools/tools-console/xbom/xbom) **홈** 뷰에 나열된 **State**.
* **Games & apps** 뷰의 게임 옆에 [Dev Home](/ko/tools/tools-console/devhome/devhome)에 나열된 값.
* [XBOX Device Portal](/ko/tools/tools-console/wdp/wdp).
* [xbapp query](/ko/tools/tools-console/commandlinetools/xbapp) 명령줄 도구.

### Running

게임이 실행 중일 때는 전체 리소스 가용성으로 실행됩니다. 게임에는 입력 포커스가 있으며, 사용자에게 창이 표시됩니다. 전체 리소스 가용성은 게임이 다음과 함께 실행되고 있음을 의미합니다:

* XBOX One 제품군 장치에서 6개의 물리 CPU 코어(core0-core5)와 CPU core6의 50–90%, XBOX Series 콘솔에서 CPU core6의 100%.
* GPU의 97–100% 사용. 운영 체제는 GPU의 최대 3%를 사용할 수 있음을 유의하십시오.
* MicrosoftGame.config의 설정과 게임이 실행되는 콘솔에 따라 5–13GB의 메모리. 자세한 내용은 [타이틀 메모리 구성](/ko/build/console-features/memory/system-memory-tooling)을 참고하십시오.

Running 상태와 Constrained 상태 간 CPU 리소스 변경을 더 잘 설명하기 위해, 게임이 Running 상태일 때 CPU 코어의 상태를 보여주는 다음 다이어그램을 살펴보십시오.

<img src="https://mintcdn.com/microsoft-4404708b/-_0FrcE2bDxzGxv-/images/gdk/lifecycle/cpu-resource-diagram-x1-running.png?fit=max&auto=format&n=-_0FrcE2bDxzGxv-&q=85&s=860d4002788745eb605483ca4d85c1d3" alt="게임이 Running 상태일 때 CPU 코어의 상태를 보여주는 다이어그램" width="600" height="171" data-path="images/gdk/lifecycle/cpu-resource-diagram-x1-running.png" />

XBOX Series 콘솔은 동시 멀티스레딩(SMT)을 활성화할 수 있으며, 이는 다이어그램을 약간 변경합니다. SMT에 대한 자세한 내용은 XBOX One 대 XBOX Series X|S CPU 및 메모리와 SMT를 사용하는 CPU 코어에 대한 다이어그램의 [부록](#smt-diagrams)을 참고하십시오.

### Constrained

게임이 Constrained 실행 상태에서 실행될 때는 감소된 리소스 가용성으로 실행됩니다. 이 상태에서는 게임이 사용자 입력을 받을 수 없습니다. 게임의 창이 부분적으로 가려지거나 사용자에게 보이지 않을 가능성이 높습니다. 사용자가 활성 게임 외의 다른 것(가이드와 같은 메뉴, 설정과 같은 시스템 앱, Account Picker와 같은 타이틀 호출 가능 UI(TCUI))과 상호작용할 때 게임이 이 상태로 전환됩니다. 게임이 Constrained되면 사용 가능한 리소스가 다음 상태로 감소합니다.

* 4개의 물리 CPU 코어. 스레드는 다음 패턴으로 접힙니다.
  * core0과 core1의 스레드는 영향을 받지 않습니다.
  * core2와 core3의 스레드는 하나의 물리 CPU 코어에 시간 분할됩니다.
  * core4, core5, core6의 스레드는 하나의 물리 CPU 코어에 시간 분할됩니다.
* GPU의 약 45%.
* Running 상태와 동일한 사용 가능한 메모리. Constrained 상태에 있어도 게임에서 사용 가능한 메모리 양이 변경되지 않는다는 점을 유의하십시오.

다음 그림은 게임이 Constrained 상태일 때 CPU 코어의 상태를 보여줍니다.

<img src="https://mintcdn.com/microsoft-4404708b/-_0FrcE2bDxzGxv-/images/gdk/lifecycle/cpu-resource-diagram-x1-constrained.png?fit=max&auto=format&n=-_0FrcE2bDxzGxv-&q=85&s=208b833caebeb949daa6877a76ceed6c" alt="게임이 Constrained 상태일 때 CPU 코어의 상태를 보여주는 그림" width="595" height="128" data-path="images/gdk/lifecycle/cpu-resource-diagram-x1-constrained.png" />

### Suspending

게임이 Suspending 실행 상태에서 실행될 때는 Constrained와 동일한 리소스로 실행되지만, 콘솔이 게임을 Suspended 상태로 전환하는 프로세스를 시작했음을 나타냅니다. Suspending은 일시적인 상태입니다. 따라서 실행 상태를 얼마나 자주 쿼리하는지에 따라 Suspending 실행 상태는 관찰하기 어려울 수 있습니다.

### Suspended

게임이 Suspended 실행 상태에 있을 때는 여전히 메모리에 상주하지만 더 이상 실행되지 않습니다. 스레드가 스케줄링되지 않으므로 결과적으로 CPU나 GPU의 시간을 사용하지 않습니다. 게임이 일시 중단되면 게임이 실행되는 전체 Game OS도 마찬가지로 일시 중단되며, 다른 상태 전환이 발생할 때까지 운영 체제와 메모리 상태는 변경되지 않은 상태로 유지됩니다.

### Not Running

이는 실행되지 않고, 메모리에 로드되지 않으며, 콘솔 리소스를 사용하지 않는 게임의 상태입니다. 일부 도구(예: `xbapp query`)는 이 실행 상태를 패키지 실행 상태 0(unknown)으로 보고할 수 있음을 유의하십시오.

<br />

<a id="life-cycle-state-transitions" />

## 수명 주기 상태 전환

이 섹션에서는 각 수명 주기 상태 전환을 설명하고 각각에 대한 예시 원인을 제공합니다. 콘솔과의 일부 사용자 상호작용은 이러한 이벤트 중 많은 것을 순차적으로, 때로는 매우 빠르게 발생시킬 수 있지만, 게임은 여전히 이러한 모든 전환을 단계별로 진행합니다. 다음 다이어그램은 수명 주기 상태 간의 상태 전환을 보여줍니다. 단순화를 위해, 다이어그램은 오류가 없는 전환만 보여줍니다. 게임은 크래시로 인해 어떤 상태에서든 Not Running 상태로 전환될 수 있음을 유의하십시오.

<img src="https://mintcdn.com/microsoft-4404708b/-_0FrcE2bDxzGxv-/images/gdk/lifecycle/gdk-life-cycle-state-transition-diagram.png?fit=max&auto=format&n=-_0FrcE2bDxzGxv-&q=85&s=45f4a5b0c2d951728a177354e447153d" alt="각 수명 주기 상태 전환을 보여주는 다이어그램" width="624" height="552" data-path="images/gdk/lifecycle/gdk-life-cycle-state-transition-diagram.png" />

### Running에서 Constrained로 전환 (Constrain)

이 전환은 게임에서 사용 가능한 리소스의 감소를 나타냅니다. 게임은 [RegisterAppConstrainChangeNotification](#life-cycle-event-callbacks)을 호출하여 이 이벤트가 발생할 때 콜백을 받도록 등록할 수 있습니다. 이 전환은 다음과 같은 경우에 발생합니다:

* 사용자가 가이드를 엽니다.
* TCUI가 표시됩니다(예: Account Picker).
* 사용자가 홈으로 돌아갑니다.
* 게임이 포커스를 잃습니다.

### Constrained에서 Suspending으로 전환 (Suspend 시작)

게임이 일시 중단되는 과정에 있을 때, 먼저 Suspending 상태로 전환됩니다. [RegisterAppStateChangeNotification](#life-cycle-event-callbacks)으로 등록된 모든 콜백이 발생합니다. 게임은 모든 콜백 핸들러에서 반환될 때까지 또는 1초 시간 초과가 발생할 때까지 Suspending 상태로 유지됩니다. 시간 초과 전에 핸들러가 반환되면 게임은 일시 중단을 완료합니다. 그렇지 않으면 게임이 종료됩니다. 게임은 다음과 같은 경우에 일시 중단을 시작합니다:

* 콘솔이 Connected Standby로 전환됩니다.
* 게임이 10분 동안 보이지 않았습니다.
* 새 게임이 실행되는 것과 같이 게임 종료의 첫 단계가 발생합니다.

<Note>
  이 전환은 때때로 *quiesce* 라고도 합니다.
</Note>

### Suspending에서 Suspended로 전환 (Suspend 완료)

이 전환은 [RegisterAppStateChangeNotification](#life-cycle-event-callbacks)으로 등록된 콜백 핸들러에서 Suspending 상태의 게임이 반환될 때 자동으로 발생합니다. 게임의 스레드는 이 상태에 진입하는 즉시 실행을 중지합니다.

### Suspended에서 Not Running으로 전환 (Terminate)

이 전환은 메모리에서 게임의 제거를 나타냅니다. 일시 중단된 게임은 실행되지 않기 때문에 이 전환에 대한 제어권이나 상호작용이 없습니다. 종료는 다음과 같은 경우에 발생합니다:

* 사용자가 홈에서 게임 종료를 선택할 때.
* 콘솔이 종료될 때(Connected Standby로 전환되지 않음).
* 새 게임이 실행되는 것과 같이 게임 종료의 최종 단계에서.
* 게임 저장 데이터가 클라우드와 동기화되지 않을 때. 자세한 내용은 [Connected Storage 시스템에 의한 종료](#termination-connected-storage)를 참고하십시오.

### Not Running에서 Running으로 전환 (Launch)

이 상태 전환은 Game OS 내에서 게임을 로드하고 실행하는 것을 나타내며, 종종 Game OS 자체의 실행과 일치합니다. 이는 사용자가 다음을 수행할 때마다 발생합니다:

* 게임의 타일을 선택합니다.
* 게임 초대를 수락합니다.
* XBOX 셸 및 시스템 전반에서 게임에 대한 참조와 상호작용합니다.

### Suspended에서 Constrained로 전환 (Resume)

이 상태 전환은 대부분 Unconstrain 이벤트가 뒤따릅니다. 이는 게임의 스레드가 다시 실행을 시작하는 것을 나타내며, 전환은 [RegisterAppStateChangeNotification](#life-cycle-event-callbacks)의 핸들러에 대한 콜백으로 시작됩니다. 게임은 이전에 Suspended 상태에 있었고 포그라운드로 가져올 때(대개 Not Running 상태였다면 게임을 실행시킬 것과 동일한 상호작용에서) 재개됩니다.

### Constrained에서 Running으로 전환 (Unconstrain)

이 상태 전환은 Constrain 전환의 반대입니다. 게임에서 사용 가능한 리소스가 Running 상태의 전체 양으로 다시 승격되는 것을 나타냅니다. 이 전환은 [RegisterAppConstrainChangeNotification](#life-cycle-event-callbacks)의 핸들러에 대한 콜백도 연결되어 있으며 게임이 포그라운드 애플리케이션으로 만들어질 때마다 발생합니다.

다른 게임 실행이나 콘솔 종료와 같은 일반적인 콘솔 상호작용으로 인해 게임이 종료되는 경우, 여전히 종료 전에 먼저 Suspended 상태로 전환됩니다. 이는 현재 실행 중인 게임이 종료되기 전에 상태를 저장할 수 있도록 보장합니다. 그러나 게임이 크래시하거나 일시 중단에 실패하면 Not Running 상태로 바로 전환됩니다.

<a id="termination-connected-storage" />

### Connected Storage 시스템에 의한 종료

게임의 로컬 저장 데이터가 클라우드와 동기화되지 않으면, Connected Storage 시스템은 다음 일시 중단 시 게임을 종료합니다. 이렇게 하면 다시 실행될 때 최신 저장 데이터를 동기화할 수 있습니다. 이러한 이유로 인한 종료는 크래시가 아니며 [XR-001](#xrs)의 실패를 초래하지 않습니다.

이 사례는 일반적이지 않지만, 콘솔이 XBOX 네트워크(XBOX Live라고도 함)에 연결되지 않은 상태에서 게임을 실행한 다음 실행 중에 다시 연결하는 경우 발생할 수 있습니다. 개발 중 Connected Storage가 타이틀에 대해 제대로 구성되지 않은 경우에도 발생할 수 있습니다.

[xbWatson](/ko/tools/tools-console/xbWatson/xbwatson) 또는 Visual Studio 내의 XBOX System Monitor 창에서 다음과 같은 줄을 찾아 이 사례를 인식할 수 있습니다:

```text theme={null}
 [ConsoleEtw] [1] SuspendComplete
 [ConsoleEtw] TerminateApplicationAfterSuspend <package name>
 [ConsoleEtw] Eviction of package <package name> because -2138890207
 [ConsoleEtw] [1] TerminateBegin Successful
 [ConsoleEtw] [1] TerminateComplete
```

<code>SuspendComplete</code>는 게임이 성공적으로 일시 중단되었으며 크래시하거나 시간 초과되지 않았음을 나타냅니다. <code>TerminateApplicationAfterSuspend</code>는 성공적인 일시 중단 후 시스템에 의해 종료가 시작되었음을 나타냅니다. -2138890207 값은 HRESULT로, CS\_E\_TERMINATEDTITLE\_NOLOCK이며, 종료의 이유를 보여줍니다.

<br />

<a id="life-cycle-event-callbacks" />

## 수명 주기 이벤트 콜백

이 섹션에서는 게임이 상태 사이를 전환하는 방법을 설명합니다. 또한 게임이 이러한 전환이 언제 발생하는지 결정하는 방법을 설명하고, 이러한 전환에 어떻게 응답하는지 설명합니다.

Microsoft Game Development Kit(GDK) 게임의 경우, 상태 변경 정보를 받도록 등록할 수 있는 두 가지 이벤트가 있습니다. 이는 다음 코드 예제에 나와 있습니다.

```cpp theme={null}
ULONG RegisterAppStateChangeNotification(
    _In_ PAPPSTATE_CHANGE_ROUTINE Routine,
    _In_opt_ PVOID Context,
    _Out_ PAPPSTATE_REGISTRATION* Registration
    );

ULONG RegisterAppConstrainedChangeNotification(
    _In_ PAPPCONSTRAIN_CHANGE_ROUTINE Routine,
    _In_opt_ PVOID Context,
    _Out_ PAPPCONSTRAIN_REGISTRATION* Registration
    );
```

자세한 내용은 [RegisterAppStateChangeNotification](https://learn.microsoft.com/windows/win32/api/appnotify/nf-appnotify-registerappstatechangenotification)을 참고하십시오.

<Note>
  Constrained change notification은 XBOX 콘솔 전용이며 현재 API 참조 페이지가 없습니다. API는 이름 및 매개변수에서 "State"가 "Constrained"로 약간 변경된 것을 제외하고는 매우 유사합니다.
</Note>

`PVOID Context`는 무엇이든 될 수 있으며, `Routine` 함수가 호출될 때 전달됩니다. `Registration`을 유지하여 `UnregisterAppStateChangeNotification` 및 `UnregisterAppConstrainedChangeNotification`으로 이러한 이벤트에서 등록을 해제할 수 있습니다.

register 함수에 전달된 `Routine`은 관련 이벤트가 발생할 때 타이틀 내 기본 스레드 풀의 스레드에서 호출됩니다. 이 함수로 등록된 모든 루틴은 별도의 스레드 풀 스레드에서 비동기적으로 호출됩니다. 이는 프레임 중 어느 시점에서든 발생할 수 있습니다. `RegisterAppStateChangeNotification`의 경우, 콘솔이 게임을 Suspending 상태로 설정하고 일시 중단 시간 초과를 시작하는 즉시 `Routine`이 부울 값 `true`로 호출됩니다. 게임을 Suspended 상태에서 Running 상태로 재개할 때는 `Routine`이 부울 값 `false`로 호출됩니다.

`RegisterAppConstrainedChangeNotification`의 경우, 콘솔이 게임을 Constrained 상태로 설정할 때 `Routine`이 부울 값 `true`로 호출됩니다. 게임을 Constrained 상태에서 Running 상태로 unconstrain할 때는 `Routine`이 부울 값 `false`로 호출됩니다.

이러한 이벤트를 설정하고 처리하는 방법과, 이들이 게임 프레임의 일관된 지점에서 메인 스레드에서 처리되도록 보장하는 방법을 보여주는 예시는 [XBOX One용 Microsoft Game Development Kit 포팅 가이드](/ko/build/console-features/porting-from-xbox-one-era/porting-guide-for-existing-era)의 샘플 코드를 참고하십시오. SimplePLM 샘플이나 Visual Studio의 Microsoft Game Development Kit(GDK) Direct3D 12 XBOX Game 프로젝트 템플릿의 main.cpp를 살펴볼 수도 있습니다. 샘플은 [XBOX Developer Downloads](https://aka.ms/gdkdl)에서 다운로드할 수 있습니다.

quiesce hang 미니덤프를 살펴볼 때, 어떤 스레드의 스택에서도 등록된 콜백이 보이지 않는 상당히 혼란스러운 상황에 부딪힐 수 있습니다. 이는 tail call 최적화 때문입니다 - 이를 해결하려면 콜백을 다음으로 래핑하십시오:

```cpp theme={null}
#pragma optimize( "", off ) 
/* ... */
#pragma optimize( "", on )
```

<Note>
  Windows PC에서 실행되는 Microsoft Game Development Kit(GDK) 게임은 일시 중단되지 않습니다. Windows PC에서 이러한 게임은 여전히 `RegisterAppStateChangeNotification`을 호출할 수 있지만, `PAPPSTATE_CHANGE_ROUTINE` 콜백은 발생하지 않는다는 점을 유의하십시오.
</Note>

<br />

<a id="responding-to-suspend-and-resume" />

## Suspend 및 Resume에 응답하기

사용자가 게임을 오가는 동안 매끄러운 경험을 제공하고 게임이 XR을 통과하도록 보장하려면 게임이 일시 중단하기 위해 수행해야 할 몇 가지 작업이 있습니다.

### Suspend 시간 초과

일시 중단을 완료하려면([XR-001](#xrs)를 통과하는 데 필요함) 게임에는 `RegisterAppStateChangeNotification`으로 등록된 최소 하나의 콜백 루틴이 있어야 합니다. 콜백이 발생하면 등록된 모든 루틴이 별도의 기본 스레드 풀 스레드에서 비동기적으로 호출됩니다. 게임은 모든 등록된 루틴에서 1초 내에 반환되어야 하며, 이는 게임이 Suspended 상태로 전환될 수 있음을 시스템에 알립니다. 게임이 1초 내에 일시 중단 루틴에서 반환되지 않거나 콜백이 등록되지 않으면, 게임이 종료되고 Not Running 상태로 전환됩니다([XR-001](#xrs)의 실패). 이 프로세스는 콘솔이 게임 간에 빠르게 전환할 수 있게 하면서도 게임이 일시 중단된 상태에 들어가기 전에 준비되도록 보장합니다.

### Direct3D

일시 중단 루틴이 호출되고 반환되기 전에 응답으로, 게임은 렌더 스레드에서 `ID3D12CommandQueue`에서 SuspendX를 호출해야 합니다. 이는 일시 중단 준비 시 GPU 상태가 저장되도록 보장합니다. 재개할 때 게임은 상태를 복원하기 위해 ResumeX를 호출해야 합니다. `SuspendX`와 `ResumeX` 호출 사이에 Direct3D API를 호출하면 예외가 발생하여 크래시가 발생합니다. 일시 중단 루틴에서 반환되기 전에 `SuspendX`를 호출하지 않으면 일시 중단이 실패하고 타이틀이 종료됩니다(다시 [XR-001](#xrs)의 실패). 자세한 내용은 Direct3D의 일시 중단 및 재개 지원을 참고하십시오.

### XGameSave API

게임이 일시 중단 알림을 받으면 일시 중단해야 하기 전에 1초의 실행 시간이 있습니다. 게임이 Suspended 상태에 있을 때는 추가 실행 시간 없이 Not Running 상태로 전환될 수 있습니다. 이는 그 1초의 일시 중단 시간 동안 게임이 Suspended 상태에 들어가기 전에 저장되지 않은 사용자 데이터를 저장해야 함을 의미합니다.

[XGameSave](/ko/build/core-features/common/game-save/game-saves-overview) API는 이 제한된 시간 프레임 내에서의 저장을 지원하도록 설계되었습니다. `XGameSave` API는 짧은 일시 중단 시간 창 동안 타이틀 쓰기 속도를 극대화하기 위해 타이틀 예약 외부의 RAM을 첫 번째 저장 지점으로 사용합니다. [XR-052: 사용자 상태](#xrs)는 타이틀이 사용자 진행 및 상태를 포함하여 의도하지 않은 사용자 데이터 손실을 유발해서는 안 된다고 명시합니다. 일반적으로 게임은 일시 중단 처리의 일부로 사용자 데이터 저장을 포함해야 합니다. 일시 중단 중에만이 아니라 더 자주 저장하는 것도 좋은 방법입니다. 이는 게임이 시간 초과 동안 큰 저장을 준비할 필요가 없거나, 정전과 같은 것으로 인해 사용자 데이터가 크게 손실되지 않도록 보장합니다. 자세한 내용은 [게임 저장 개요](/ko/build/core-features/common/game-save/game-saves-overview) 및 [GameSave 샘플](https://aka.ms/gdkdl)을 참고하십시오.

`XGameSave` API의 비동기 버전을 사용하는 것이 더 바람직합니다. 이렇게 하면 시스템이 게임 저장 데이터를 쓰는 동안 타이틀이 일시 중단 코드의 나머지를 계속할 수 있습니다. 이것이 수행되는 방법의 예는 XGameSaveSubmitUpdateAsync를 참고하십시오.

게임 재개 전에 운영 체제는 게임이 일시 중단된 동안 다른 장치에서 저장 게임이 수정되었는지 확인합니다. 장치가 온라인이고 이 확인이 저장이 수정되었음을 나타내면, 게임은 일관된 상태로 돌아가기 위해 종료되고 다시 실행됩니다. 확인 시 장치가 오프라인인 경우, 게임은 여전히 실행이 허용됩니다.

재개 시 게임은 항상 XGameSaveInitializeProvider 또는 XGameSaveInitializeProviderAsync를 호출하여 저장 게임 공급자를 다시 획득하려고 시도해야 합니다. 공급자를 다시 초기화하면 최신 저장 데이터를 사용할 수 있게 됩니다.

### 사용자 및 사용자 컨트롤러 페어링

[XR-112: 초기 활성화 및 재개 시 사용자 및 컨트롤러 설정](#xrs)은 타이틀이 재개될 때 사용자/컨트롤러 페어링을 검증하고, 이전 사용자의 세션을 재개하거나 새 사용자(또는 사용자들)를 획득하여 그에 따라 반응해야 한다고 명시합니다. 정확한 동작은 게임이 사용자와 컨트롤러를 어떻게 처리하는지에 따라 다를 수 있습니다. 일시 중단 전 사용자 또는 컨트롤러 상태에 대한 어떤 정보에도 의존하지 않고, 재개될 때 사용자 및 컨트롤러의 상태를 다시 설정하는 것이 중요합니다. 게임은 사용자 상태에 대한 업데이트를 받기 위해 이 방식을 사용하므로 일시 중단/재개 주기를 통해 `XUserHandle`을 유지해야 합니다. 또한 XUserRegisterForChangeEvent 및 XUserRegisterForDeviceAssociationChanged로 등록된 콜백은 재개 중에 발생한 상태 변경으로 게임을 업데이트하기 위해 발생합니다. 사용자와 장치를 관리하는 방법에 대한 자세한 내용은 사용자 ID 및 XUser 및 사용자 및 입력 장치를 참고하십시오. 게임이 이를 어떻게 처리할 수 있는지의 예는 [UserManagement 샘플](https://aka.ms/gdkdl)을 참고하십시오.

### 권한 및 특권

게임이 일시 중단된 동안 사용자는 온라인에서 허용되는 것과 다른 사람과의 통신 방법을 결정하는 계정 설정을 변경할 수 있습니다. 게임이 재개되면 관련 기능을 활성화하거나 비활성화하기 전에 모든 권한 또는 특권을 다시 확인하여 게임의 동작이 사용자 설정의 현재 상태를 반영하도록 해야 합니다. [XR-015: 플레이어 통신 관리](#xrs)는 텍스트 및 음성 통신에 대한 권한을 자세히 설명합니다. [XR-045: XBOX Live 및 계정 특권](#xrs)은 XBOX 서비스와 관련된 동작을 허용하거나 방지하기 위한 특권을 자세히 설명합니다.

### 네트워킹

Suspended 게임은 스케줄링된 스레드가 없으므로, 게임이 재개될 때 네트워크 통신이 영향을 받았을 것으로 예상해야 합니다. 이 상황을 처리하는 방법에 대한 지침은 [네트워킹 API 소개](/ko/build/console-features/networking/introduction-networking)를 참고하십시오. XBOX 서비스와 관련된 세부사항은 XBOX 서비스 API 시작하기를 참고하십시오. 멀티플레이어 세션에 대한 자세한 내용은 멀티플레이어 세션 고급 항목을 참고하십시오.

### 비동기 API

시스템 OS와의 통신이 필요한 일부 비동기 API는 게임이 일시 중단되었을 때 진행 중이었다면 실패할 수 있습니다. 이런 일이 발생하면 `Xasync` API는 `E_ABORT`로 실패해야 합니다. 이는 어떤 XR과도 관련이 없습니다. 대신, 이는 비동기 API를 호출할 때 알아둬야 할 사항입니다. 이 가능성을 우아하게 처리할 수 있도록 오류 처리가 있는지 확인하십시오. 이런 식으로 호출이 실패하면 대개 게임이 재개된 후 다시 시도하는 것이 가장 좋습니다.

### Gaming Runtime API

게임이 일시 중단 이벤트에 대한 AppStateChangedNotification 핸들러를 완료한 후에는 Gaming Runtime이 자동으로 일시 중단됩니다. 런타임은 게임의 재개 이벤트 핸들러를 호출하기 직전에 재개됩니다. 런타임이 일시 중단된 동안 다른 스레드에서 Gaming Runtime API가 호출되면 E\_GAMERUNTIME\_SUSPENDED로 실패합니다. 이는 예를 들어 일시 중단 핸들러가 끝나기 직전에 비동기 API가 호출되는 경우 발생할 수 있습니다. 콜백은 런타임이 일시 중단된 후, 하지만 게임이 스레드 스케줄링을 중지하기 전에 발생할 수 있습니다.

가능한 경우 Gaming Runtime이 일시 중단된 이 창 동안 실행될 수 있는 Gaming Runtime 호출을 피하십시오. 피할 수 없는 경우, 재개 이벤트에 대한 AppStateChangedNotification을 받은 후 오류를 감지하고 호출을 재시도할 수 있습니다.

### 오디오

일시 중단할 때 게임은 `IMMDevice`, `IMMDeviceCollection`, `IMMEndpointDevice`를 포함하여 [IMMDeviceEnumerator](https://learn.microsoft.com/windows/win32/api/mmdeviceapi/nn-mmdeviceapi-immdeviceenumerator)에서 얻은 어떤 객체도 유지해서는 안 됩니다. 먼저 `IMMDeviceEnumerator`를 사용하여 새로 고침하지 않고 재개 후 이러한 인터페이스를 사용하려고 시도하면 정의되지 않은 동작이 발생합니다. 하지만 게임이 `IMMNotificationClient`를 유지하면 해당 클라이언트는 일시 중단 및 재개 전반에서 정상적으로 계속 작동합니다. 일시 중단 중에 모든 오디오 스트림을 중지하고 재개 시 다시 시작하는 것도 모범 사례입니다(필수는 아님).

재개 중에 게임의 오디오 스트림도 무효화되며 재초기화가 필요합니다. 게임은 재개 핸들러를 실행하는 동안 또는 그 후에 이러한 무효화에서 복구하는 조치를 취해야 합니다. 자세한 내용은 XBOX One Software Development Kit과 Microsoft Game Development Kit 오디오 API 비교를 참고하십시오.

<Note>
  재개 핸들러가 실행되기 전에 오디오 스트림을 재초기화하려고 하면 정의되지 않은 동작이 발생할 수 있습니다.
</Note>

<a id="dealing-with-time" />

### 일시 중단 중 시간 변경 처리

게임이 일시 중단된 동안 많은 일이 발생할 수 있습니다. 한 가지 확실한 것은 게임이 일시 중단된 동안 시간이 진행된다는 것입니다. 게임은 이를 고려해야 하며 게임 플레이 시간과 같은 메트릭을 계산할 때 게임이 일시 중단된 동안 소요된 시간이 의도치 않게 포함되지 않도록 해야 합니다.

2021년 6월 GDK부터 게임이 일시 중단되면 time stamp counter(TSC)가 동결되어 게임이 나중에 재개될 때까지 진행되지 않습니다. 또한 TSC는 일시 중단된 동안 소요된 시간을 포함하지 않습니다. 이는 게임이 실행되는 동안 소요된 시간을 정확하게 보고하기 위해 다음에 의존할 수 있음을 의미합니다:

* \_\_rdtscp
* QueryPerformanceCounter

TSC는 일시 중단된 동안 진행되지 않지만 벽시계 시간은 진행됩니다. 이는 게임이 [GetSystemTime](https://learn.microsoft.com/windows/win32/api/sysinfoapi/nf-sysinfoapi-getsystemtime) 또는 [GetLocalTime](https://learn.microsoft.com/windows/win32/api/sysinfoapi/nf-sysinfoapi-getlocaltime)을 호출하면 시간이 진행되었음을 알 수 있음을 의미합니다.

<br />

<a id="responding-to-constrain-and-unconstrain" />

## Constrain 및 Unconstrain에 응답하기

일시 중단 알림에서는 게임이 특정 동작을 수행할 것으로 예상되고 콘솔이 루틴이 반환되기를 기다리는 것과 달리, app constrained change notification에 대한 응답에는 아무것도 필요하지 않습니다. 이벤트가 수신되면 Constrained 상태 또는 Running 상태로의 전환이 이미 발생했습니다. 대신, 이 이벤트는 게임에 사용 가능한 리소스가 변경되었으므로 그에 따라 리소스 사용량을 줄이거나 늘려야 함을 알립니다.

게임이 constrained되는 방식을 어떻게 처리할지 결정할 때, 게임이 입력 포커스가 없는 경우에만 constrained된다는 사실을 고려하십시오. 따라서 사용자는 constrained된 동안 게임과 상호작용할 수 없습니다. 이 때문에 대부분의 게임은 constrained된 동안 게임플레이(또는 일시 중지에 가장 가까운 것)를 일시 중지해야 합니다. 하지만 게임은 constrained된 동안에도 여전히 보일 수 있으므로 사용자가 게임 상태를 볼 수 있도록 무언가를 계속 렌더링하는 것이 중요합니다. 사용자가 곧 게임을 포그라운드로 다시 가져올 가능성이 높으므로, 멀티플레이어 매치 및 기타 네트워크 통신을 유지하는 것도 사용자에게 더 나은 경험일 것입니다.

궁극적으로 Constrain 처리의 유일한 목표는 감소된 CPU 및 GPU 시간에 적응하면서 게임을 실행 상태로 유지하는 것입니다. 이를 달성하는 최선의 방법은 게임의 개별 요구사항에 따라 다릅니다.

<br />

<a id="launching" />

## 실행

Microsoft Game Development Kit(GDK) 게임은 전통적인 Windows 메시지 루프를 갖춘 Win32 설계입니다. 이러한 이유로 실행될 때 코드에 대한 첫 번째 개발자 대면 진입점은 `WinMain`에 전달되는 매개변수입니다. 또는 게임은 `GetCommandLine` 함수를 사용하여 실행된 매개변수를 쿼리할 수 있습니다. XBOX One ERA 또는 UWP와 달리, Microsoft Game Development Kit(GDK) 게임은 활성화 시간 초과를 받지 않으며 Activated 이벤트 핸들러가 없습니다. 또한 XBOX One ERA 또는 UWP와 달리 Microsoft Game Development Kit(GDK) 게임은 활성화 또는 실행 매개변수를 사용하여 게임 초대를 처리하지 않습니다. 대신, 게임 초대를 처리해야 하는 Microsoft Game Development Kit(GDK) 게임은 `XGameInviteRegisterForEvent`를 사용하여 해당 이벤트에 대해 등록해야 합니다. 게임이 등록을 수행하면 사용 가능한 대기 중인 모든 초대를 받습니다.

<br />

<a id="events-related-to-life-cycle" />

## 수명 주기와 관련된 이벤트

이러한 이벤트는 실제로 수명 주기 이벤트가 아닙니다. 이는 상태 전환의 원인 및 조건과 관련된 이벤트입니다. 이러한 이벤트를 식별하고 그에 따라 응답하는 방법을 결정하는 데 유용할 수 있습니다.

#### 입력 포커스

게임에 입력 포커스가 있음을 알기 위해 Microsoft Game Development Kit(GDK) 게임은 `WindowProc` 콜백에서 `WM_ACTIVATEAPP` 창 알림을 수신 대기할 수 있습니다. 이는 Win32 Windows PC 구현과 동일하며 동일한 문서가 적용됩니다. 자세한 내용은 [WM\_ACTIVATEAPP 메시지](https://learn.microsoft.com/windows/win32/winmsg/wm-activateapp)를 참고하십시오.

다음 코드 예제는 이 이벤트를 수신 대기하는 방법을 보여줍니다.

```cpp theme={null}
// Windows procedure.
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_ACTIVATEAPP:
        OutputDebugString((wParam) ? L"Activated\n" : L"Deactivated\n");
        break;
    ...
```

#### 가시성

게임의 창이 보이는지 확인하려면(입력 포커스와 유사) Microsoft Game Development Kit(GDK) 게임은 `WindowProc` 콜백에서 `WM_SHOWWINDOW` 창 알림을 수신 대기할 수 있습니다. 자세한 내용은 [WM\_SHOWWINDOW 메시지](https://learn.microsoft.com/windows/win32/winmsg/wm-showwindow)를 참고하십시오.

다음 코드 예제는 `WindowProc` 콜백에서 `WM_SHOWWINDOW` 창 알림을 수신 대기하는 방법을 보여줍니다.

```cpp theme={null}
// Windows procedure.
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_SHOWWINDOW:
        OutputDebugString((wParam) ? L"Visible\n" : L"Not Visible\n");
        break;
    ...
```

<br />

<a id="timeouts" />

## GDK 시간 초과 작업

XBOX One ERA 및 UWP 개발자는 활성화, 일시 중단, 행 감지를 위한 다양한 시간 초과를 다룹니다. Microsoft Game Development Kit(GDK) 게임은 Win32 설계이며, 대부분의 경우 실행 중인 게임에 대한 리소스 가용성을 최대한 보장하기 위해 리소스 상태를 변경할 수 있어야 하는 콘솔에서 실행되는 경우를 제외하고 비교할 수 있는 개념이 없습니다. 다음 표는 다양한 플랫폼 간의 다양한 동작을 비교합니다.

| 핸들러/시간 초과 | Microsoft Game Development Kit(GDK) | XBOX One ERA | UWP |
| - | - | - | - |
| 활성화 핸들러 | 해당 없음 | `CoreApplicationView:: Activated` | `CoreApplicationView::Activated` |
| 활성화 시간 초과 | 해당 없음 | 45 s | 10 s |
| 일시 중단 핸들러 | `RegisterAppStateChangeNotification` | `CoreApplication:: Suspending` | `CoreApplication:: Suspending` |
| 일시 중단 시간 초과 | 1 s | 1 s | 5 s |
| 재개 핸들러 | `RegisterAppStateChangeNotification` | `CoreApplication:: Resuming` | `CoreApplication:: Resuming` |
| 재개 시간 초과 | 해당 없음 | 해당 없음 | 해당 없음 |
| Constrain 핸들러 | `RegisterAppConstrainedChangeNotification` | `CoreApplication:: ResourceAvailabilityChanged` | 해당 없음 |
| Constrain 시간 초과 | 해당 없음 | 해당 없음 | 해당 없음 |
| Hang 시간 초과 | 해당 없음 | 2 s | 2 s |

<br />

<a id="quick-resume" />

## Quick Resume

Quick Resume은 XBOX Series 콘솔의 2020년 6월 recovery의 새 기능입니다. 다른 게임이 실행되는 동안 게임을 일시 중단된 상태로 유지하여 사용자가 이전보다 빠르게 게임 간에 전환할 수 있는 방법을 제공합니다. 모든 XBOX One 제품군 장치와 2020년 6월 recovery 이전의 XBOX Series 콘솔에서는 게임이 실행 중이거나(또는 constrained 또는 suspended되어 있을 때) 사용자가 새 게임을 선택하면 첫 번째 게임이 종료되고 새 게임이 실행됩니다. 2020년 6월 recovery 이상의 XBOX Series 콘솔에서는 첫 번째 게임을 대신 일시 중단할 수 있으며, 그 후 전체 Game OS와 메모리를 일시 중단된 상태로 저장할 수 있습니다. 사용자가 다시 전환하면 Game OS가 복원됩니다. 그런 다음 게임을 재개할 수 있습니다. 저장된 Game OS는 콘솔 재시작 후에도 복원할 수 있습니다. 게임의 관점에서 이는 일반 일시 중단/재개와 동일합니다. 추가 단계나 코드가 필요하지 않습니다. 게임이 성공적으로 일시 중단 및 재개할 수 있다면 Quick Resume도 완전히 지원합니다.

Quick Resume 때문에 게임이 실행 세션 내에서 수백 시간 동안 실행되기가 더 쉬워졌습니다. 게임은 며칠, 몇 주 또는 몇 달 동안 일시 중단된 상태로 유지될 수 있습니다. 이는 일시 중단 전에 확립된 상태 정보(특히 사용자에 대한 정보)가 재개될 때 참이라고 가정되지 않도록 하는 것이 중요합니다. 예를 들어 게임이 깊은 사회적 관계를 활용한다면, 새 친구가 추가되고 다른 친구가 제거될 수 있습니다. 친구에 대한 존재 정보를 사용한다면, 지난주에 그들이 하고 있던 것이 게임이 재개될 때 정확히 동일한 일을 하고 있을 가능성은 낮습니다. 접근성 기본 설정, 특권, 리더보드에도 유사한 문제가 적용됩니다.

<Warning>
  시간이 지남에 따라 쉽게 변경될 수 있는 상태를 다시 쿼리하도록 하십시오.
</Warning>

<br />

<a id="debugging-tools-and-features" />

## 디버깅 도구 및 기능

이 섹션에서는 게임의 수명 주기를 디버그하고 테스트하는 데 도움이 되는 일부 도구, 로그, 기능에 대해 설명합니다.

### 수명 주기 전환 도구

디버깅과 테스트를 위해서는 게임이 어떤 상태에 있는지 알고 게임이 상태 간에 전환하도록 하는 것이 중요합니다. 현재 수명 주기 상태를 쿼리하고 상태 전환을 수행하는 데 사용할 수 있는 몇 가지 도구가 있습니다. [XBOX Manager](/ko/tools/tools-console/xbom/xbom), [XBOX Device Portal](/ko/tools/tools-console/wdp/wdp), [xbapp](/ko/tools/tools-console/commandlinetools/xbapp) 명령줄 도구는 모두 애플리케이션의 현재 상태를 나열합니다. 이들은 모두 다양한 전환을 수행하기 위한 명령을 제공합니다. 예를 들어, 다음 스크린샷은 XBOX Manager의 State 및 Actions 메뉴를 보여줍니다.

<img src="https://mintcdn.com/microsoft-4404708b/-_0FrcE2bDxzGxv-/images/gdk/lifecycle/xbom-life-cycle-tools.png?fit=max&auto=format&n=-_0FrcE2bDxzGxv-&q=85&s=bca79514d50eceeaaadd88e30150d4fe" alt="XBOX Manager의 State 및 Actions 메뉴를 보여주는 스크린샷" width="1024" height="443" data-path="images/gdk/lifecycle/xbom-life-cycle-tools.png" />

<Note>
  더 빠른 반복 시간을 제공하고 테스트 유연성을 지원하기 위해, 'terminate' 명령이 unpackaged 게임에 사용되면 먼저 일시 중단되지 않고 Not Running 상태로 바로 전환됩니다. 일반적으로 종료되는 방식으로 게임을 종료하려면 `suspend` 명령으로 먼저 일시 중단하십시오.
</Note>

Running에서 Suspended로의 전환은 devkit의 전면 패널 버튼 중 하나를 사용하여 트리거할 수도 있습니다. Microsoft Game Development Kit(GDK)에 포함된 *Suspend\_Title* 스크립트는 [XBOX Manager](/ko/tools/tools-console/xbom/xbom) 또는 [XBOX Device Portal](/ko/tools/tools-console/wdp/wdp)을 사용하여 전면 패널 버튼에 매핑할 수 있습니다. Resume 상태로의 전환은 전면 패널 버튼에서 트리거할 수 없다는 점을 유의하십시오. Resume은 홈이나 내 게임 및 앱에서 게임의 타일을 선택하거나 [xbApp](/ko/tools/tools-console/commandlinetools/xbapp), [Visual Studio](/ko/tools/tools-console/visualstudio/debugging-with-visualstudio), [XBOX Manager](/ko/tools/tools-console/xbom/xbom)와 같은 다른 도구를 사용하여 콘솔의 셸에서 수행해야 합니다.

### xbWatson 및 Visual Studio의 상태 전환 로깅

상태 전환이 언제 발생하는지 아는 것은 현재 수명 주기 상태를 아는 것만큼 중요합니다. 수명 주기 상태 전환에 대한 상당한 양의 로깅 지원이 [xbWatson](/ko/tools/tools-console/xbWatson/xbwatson) 및 Visual Studio 내의 XBOX System Monitor 창에 표시됩니다. 이제 상태 전환이 있을 때마다 애플리케이션과 관련된 다른 이벤트(예: 애플리케이션 시작 단계와 시스템 전체의 포커스 변경)에 대한 정보와 함께 로그가 기록됩니다.

다음 스크린샷은 xbWatson을 사용할 때 상태 전환이 언제 발생하는지 보여줍니다.

<img src="https://mintcdn.com/microsoft-4404708b/-_0FrcE2bDxzGxv-/images/gdk/lifecycle/xbwatson-state-transition-logging.png?fit=max&auto=format&n=-_0FrcE2bDxzGxv-&q=85&s=ce4fb9b46af97e85c05c3c975306cbf4" alt="xbWatson을 사용할 때 상태 전환이 언제 발생하는지 보여주는 스크린샷" width="742" height="516" data-path="images/gdk/lifecycle/xbwatson-state-transition-logging.png" />

새 로깅 기능에는 수명 주기 이벤트에 대한 오류 및 실패도 포함됩니다. 이 로그를 확인하면 문제가 발생했을 때 이를 식별하거나 오류 사례에 대한 추가 정보를 제공할 수 있습니다. 오류가 발생하고 `HRESULT`가 보고되면 xberror 명령줄 도구를 확인하여 자세한 정보를 찾을 수 있습니다. 이전 스크린샷에 나온 오류 사례에서 `xberror`는 타이틀이 일시 중단 핸들러 동안 시간 초과되었음을 보여줍니다(`E_GAME_SUSPEND_TITLE_TIMEOUT`).

### Suspend 시간 초과 시 중단

2020년 6월 Microsoft Game Development Kit(GDK)의 새 기능은 Visual Studio가 Microsoft Game Development Kit(GDK) 게임을 디버깅 중이고 1초 시간 초과 때문에 일시 중단에 실패하면 자동으로 중단할 수 있는 기능입니다. 이 설정은 기본적으로 꺼져 있습니다. 그러나 다음 스크린샷과 같이 프로젝트의 디버깅 속성에서 변경할 수 있습니다.

<img src="https://mintcdn.com/microsoft-4404708b/-_0FrcE2bDxzGxv-/images/gdk/lifecycle/vs-break-on-suspend-timeout.png?fit=max&auto=format&n=-_0FrcE2bDxzGxv-&q=85&s=455bf244914b06fd15d160da94a39317" alt="suspend 시간 초과 시 중단을 보여주는 스크린샷" width="832" height="245" data-path="images/gdk/lifecycle/vs-break-on-suspend-timeout.png" />

프로젝트를 열지 않아도 XBOX Gaming Explorer 창을 사용하여 설치된 게임에 대해 이 설정을 변경할 수도 있습니다. XBOX Gaming Explorer에서 게임을 선택한 다음 **Properties** 도구 창에서 **Break on Suspend Timeout** 설정을 변경하십시오. 자세한 내용은 [XBOX Gaming Explorer](/ko/tools/tools-console/visualstudio/xbox-gaming-explorer)를 참고하십시오.

이것은 hang이 있거나 일시 중단 프로세스의 일부가 예상보다 오래 걸리는 일시 중단 실패를 디버깅하는 데 훌륭할 수 있습니다. 디버거는 중단을 유발하기 위해 INT3와 함께 게임 프로세스에 새 스레드를 삽입하여 이를 수행합니다. 이는 디버거가 초기에 겉보기에 빈 스레드에서 중단되지만, 다른 스레드는 1초 시간 초과가 발생할 때 있는 곳에서 중단됨을 의미합니다. Visual Studio로 게임 수명 주기 상태를 디버깅하는 방법에 대한 자세한 내용은 [Visual Studio를 사용하여 XBOX 프로젝트 디버깅](/ko/tools/tools-console/visualstudio/debugging-with-visualstudio)을 참고하십시오.

<a id="automatic-suspend-failure-dumps" />

### 자동 일시 중단 실패 덤프

일시 중단 실패가 있을 때마다 자동 진단 크래시 덤프가 콘솔에 기록됩니다. 덤프는 개발자 포털에도 업로드됩니다. 이러한 덤프는 콘솔의 *D:\LocalDumps\\* 에 저장됩니다. 2020년 6월 업데이트로 [xbWatson](/ko/tools/tools-console/xbWatson/xbwatson)도 콘솔에서 사용 가능한 덤프를 나열합니다. 메뉴에서 덤프를 다운로드하는 옵션도 있습니다. 이러한 것들은 quiesce가 일시 중단의 다른 이름이기 때문에 *quiesce 메모리 덤프* 라고 합니다. 다음 스크린샷은 콘솔에서 사용 가능한 quiesce 메모리 덤프를 보여줍니다.

<img src="https://mintcdn.com/microsoft-4404708b/-_0FrcE2bDxzGxv-/images/gdk/lifecycle/xbwatson-quiesce-memory-dumps.png?fit=max&auto=format&n=-_0FrcE2bDxzGxv-&q=85&s=bc878ec0e3a3f69493b625fb98c86233" alt="콘솔에서 사용 가능한 quiesce 메모리 덤프를 보여주는 스크린샷" width="940" height="637" data-path="images/gdk/lifecycle/xbwatson-quiesce-memory-dumps.png" />

진단 덤프는 일시 중단 콜백(`PAPPSTATE_CHANGE_ROUTINE`)이 호출될 예정이었지만 등록된 일시 중단 핸들러가 없을 때도 생성됩니다. 진단 덤프는 일시 중단 핸들러를 종료하기 전에 `ID3D12CommandQueue::SuspendX`가 호출되지 않은 경우에도 생성됩니다.

### 상태 전환을 수동으로 발생시키기

콘솔과 상호작용하여 각 상태 전환을 수동으로 트리거할 수 있습니다. 다음 표는 도구 없이 각 상태 전환을 트리거하는 방법을 나열합니다(게임이 전환에 대해 적절한 시작 상태에 있다고 가정).

| 전환 | 동작 |
| - | - |
| Launch | **홈** 또는 **내 게임 및 앱** 에서 게임의 타일을 선택하십시오. |
| Constrain | 컨트롤러의 **XBOX** 버튼을 눌러 **가이드** 를 여십시오. |
| Suspend | 전원 모드가 **Instant-on** 으로 설정된 경우 콘솔을 끄십시오. |
| Terminate | 게임의 타일이 선택된 상태에서 컨트롤러의 **메뉴** 버튼을 누른 다음 **종료** 를 선택하십시오. |
| Resume | **홈** 또는 **내 게임 및 앱** 에서 게임의 타일을 선택하십시오. unconstraining도 피하려면 전환 중에 **가이드** 를 여십시오. |
| Unconstrain | 컨트롤러의 **XBOX** 버튼을 눌러 **가이드** 를 닫으십시오. |

<br />

<a id="appendix" />

## 부록

<a id="xrs" />

### XR 보기

#### XR 목록을 다운로드하려면

1. [XBOX Developer Downloads](https://aka.ms/gdkdl)로 이동합니다.
2. 파일 유형으로 **Partner, Publishing, and Release Management Information** 을 선택합니다.
3. **Confirm** 을 선택합니다.
4. 빌드/버전 번호로 사용 중인 릴리스와 일치하는 XGD Partner Documentation 버전을 선택합니다.
5. **Confirm** 을 선택합니다. **Download Now** 버튼이 나타나 문서를 다운로드하도록 요청합니다.

### 수명 주기 이벤트에 대한 진단 원격 측정

콘솔 플랫폼은 다음 표에 나와 있는 이벤트에 대한 원격 측정을 보냅니다.

| 이벤트 | 설명 |
| - | - |
| Launch 시간 | 게임을 시작하기 위해 `CreateProcess`가 호출된 시간과 게임이 첫 번째 present 호출을 수행하는 시간 간의 시간. |
| Resume 시간 | 게임 파티션이 재개된 시간과 게임이 다음 present를 수행하는 시간 간의 시간. |

<a id="smt-diagrams" />

### SMT가 활성화된 XBOX Series 콘솔의 CPU 리소스 다이어그램

SMT에 대한 자세한 내용은 XBOX One 대 XBOX Series X|S CPU 및 메모리를 참고하십시오.

#### Running

다음 다이어그램은 Running 게임에 대한 CPU 코어와 가상 코어 간의 매핑을 보여줍니다.

<img src="https://mintcdn.com/microsoft-4404708b/-_0FrcE2bDxzGxv-/images/gdk/lifecycle/cpu-resource-diagram-smt-running.png?fit=max&auto=format&n=-_0FrcE2bDxzGxv-&q=85&s=f74e206f1a1c658a3cfcac5513c9a381" alt="Running 게임에 대한 CPU 코어와 가상 코어 간의 매핑을 보여주는 다이어그램" width="603" height="135" data-path="images/gdk/lifecycle/cpu-resource-diagram-smt-running.png" />

#### Constrained

다음 다이어그램은 Constrained 게임에 대한 CPU 코어와 가상 코어 간의 매핑을 보여줍니다.

<img src="https://mintcdn.com/microsoft-4404708b/-_0FrcE2bDxzGxv-/images/gdk/lifecycle/cpu-resource-diagram-smt-constrained.png?fit=max&auto=format&n=-_0FrcE2bDxzGxv-&q=85&s=c479b8f5ea2e3834c68edd7745b0ffe7" alt="Constrained 게임에 대한 CPU 코어와 가상 코어 간의 매핑을 보여주는 다이어그램" width="593" height="130" data-path="images/gdk/lifecycle/cpu-resource-diagram-smt-constrained.png" />


## Related topics

- [IXtfApplicationClient::Uninstall](/ko/reference/tools/xtf/xtfapplication/classes/IXtfApplicationClient/methods/uninstall-ixtfapplicationclient-xtfapplication-xbox-microsoft-m.md)
- [XGameUiShowAchievementsAsync](/ko/reference/system/xgameui/functions/xgameuishowachievementsasync.md)
- [XGameUiShowErrorDialogAsync](/ko/reference/system/xgameui/functions/xgameuishowerrordialogasync.md)
- [XGameUiShowMessageDialogAsync](/ko/reference/system/xgameui/functions/xgameuishowmessagedialogasync.md)
- [XGameUiShowPlayerProfileCardAsync](/ko/reference/system/xgameui/functions/xgameuishowplayerprofilecardasync.md)
