> ## 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.

# Dynamic Power States (DPS)

> Dynamic Power States를 옵트인해 GPU 드라이버가 렌더링 워크로드에 따라 전력을 스케일링하도록 설정하면 XBOX Series 콘솔에서 추가로 10–15%를 절감할 수 있습니다.

<Warning>
  DPS는 **XBOX Series** 콘솔에서만 사용할 수 있습니다. 이전 세대 XBOX 콘솔에서는 효과가 없습니다.
</Warning>

**Dynamic Power States(DPS)** 는 렌더링 워크로드에 따라 GPU의 전력 수준을 동적으로 조정합니다. GPU가 완전히 활용되지 않을 때 DPS는 전력 상태를 낮춰 성능을 저해하지 않으면서 에너지를 절약합니다. 그래픽 드라이버가 최근의 프레임 타임 기록을 바탕으로 조정을 자동으로 수행합니다.

DPS가 없으면 GPU는 전력 상태 **P4**에 고정되므로, 유휴 상태의 GPU도 필요 이상의 전력을 소비합니다. DPS는 워크로드가 허용할 때마다 더 낮은 전력 상태(P0–P3)를 사용할 수 있게 합니다.

## 작동 방식

1. 게임이 GPU 동적 전력 상태를 활성화합니다.
2. GPU는 정규화된 프레임 통계를 계산하고 이를 이력 데이터로 저장합니다.
3. GPU는 현재 요구량과 이력을 바탕으로 전력 상태를 자동으로 변경하여 에너지를 절약합니다.

<Note>
  게임은 [XBOX Sustainability Toolkit](/build/game-principles/sustainability/energy-efficiency-essentials)의 나머지 부분을 채택해 에너지 소비를 더 줄일 수 있습니다.
</Note>

## 사례 연구

### Call of Duty: Black Ops 6

Call of Duty의 기술 담당 수석 이사, Rulon Raymond:

> DPS로 며칠간 실험했고 결과는 유망했습니다. 구체적으로, XBOX Sustainability Toolkit으로 도입한 부분 **외에도** **추가로 10–15%의 전력 절감**을 확인할 수 있었습니다. 우리는 이미 메뉴나 프런트엔드 화면 같은 곳에서 게임 엔진의 일부를 스로틀링하고 있었고, 플레이어의 프레임 레이트에는 영향 없이 상당한 전력을 절감하고 있었습니다. 그런데 DPS 덕분에 추가로 무노력 절감을 얻을 수 있었습니다.

Black Ops 6 팀의 출시 시점 계획:

* 이미 전력 절감 조치를 적용한 모든 영역에서 DPS를 활성화한다.
* 여러 날에 걸친 성능 테스트가 계속되는 동안 항상 DPS를 활성화하는 플래그를 기본 비활성화로 노출한다.

### Two Point Museum

Two Point Studios의 기술 이사이자 공동 창립자인 Ben Hymers는 XBOX 팀이 관리하는 클라우드 설정을 통해 코드 변경 없이 DPS를 출시했습니다:

> 우리는 에너지 효율을 극대화하기 위해 Constrained+ 모드와 함께 Dynamic Power States를 테스트했습니다. 이 기능들이 결합되어 **메인 메뉴에서 전력 소비를 약 50–58%** 줄였고, 제한 모드 중 에너지 사용량을 **39–63%** 절감했습니다. 롤아웃 이후 게임 플레이 품질 저하 없이 평균 에너지 소비가 눈에 띄게 감소하는 것을 확인했습니다. 예를 들어 XBOX Series X의 소비 전력은 평균 **135 W에서 125 W로** 낮아졌습니다. 이는 전체 플레이어 기반에서 연간 약 **6.5 메가와트시** 절감에 해당하며, TV를 65,000시간, 즉 거의 7.5년 동안 논스톱으로 시청하는 것과 같습니다.

Two Point Museum은 클라우드 구성을 통해 DPS를 원격으로 채택한 최초의 서드파티 스튜디오입니다.

## 코드 변경 없이 DPS 테스트하기(개발 전용)

빌드를 다시 하지 않고도 devkit에서 DPS를 전역으로 활성화할 수 있습니다.

<Steps>
  <Step title="devkit 업데이트">
    devkit에 최소한 **2024년 8월 Recovery**가 설치되어 있는지 확인하세요.
  </Step>

  <Step title="플래그 파일 생성">
    PC에서 `DynamicPowerEnable`이라는 이름의 빈 파일을 생성하세요.
  </Step>

  <Step title="콘솔의 D: 드라이브로 복사">
    ```sh theme={null}
    xbcp DynamicPowerEnable xD:\
    ```
  </Step>

  <Step title="실행 및 프로파일링">
    게임을 실행하세요. 이제 DPS가 활성화됩니다.
  </Step>

  <Step title="테스트 완료 후 DPS 비활성화">
    ```sh theme={null}
    xbdel xD:\DynamicPowerEnable
    ```

    게임을 다시 실행하세요.
  </Step>
</Steps>

### 실시간으로 DPS 관찰하기

PIX 또는 XBOX Manager의 콘솔 설정에서 **Title Performance Overlay**를 활성화하세요.

* DPS가 활성화된 경우 오버레이 하단 오른쪽에 빨간 선과 **GPU 전력 상태** 지표(0–4)가 표시됩니다. **4**는 최대 속도를 의미하며, 값이 낮을수록 에너지를 절약하고 있음을 뜻합니다.
* DPS가 비활성화된 경우 GPU 전력 상태는 `N/A`로 표시됩니다.

PIX의 **Power Load %** 지표를 사용해 게임의 특정 부분에서 GPU 에너지 사용량의 변화를 측정하세요.

<Warning>
  타이틀은 리테일에서 `DynamicPowerEnable` 파일로 DPS를 활성화할 **수 없습니다**. 리테일 릴리스에서는 아래의 `SetDriverHintX`를 사용하세요.
</Warning>

## 게임에서 DPS 활성화(리테일)

그래픽 디바이스의 기존 `SetDriverHintX()` API를 사용합니다.

### API

```cpp theme={null}
SetDriverHintX(UINT feature, UINT value);
```

**2024년 6월 GDK** 이상에서는 다음 열거형을 사용하세요.

```cpp theme={null}
DRIVER_HINT_SET_DYNAMIC_POWER
```

**2024년 6월 이전의 GDK**(또는 이전 XDK 타이틀)에서는 값을 직접 사용하세요.

```cpp theme={null}
0xEFF1C1E7
```

### DPS 활성화

```cpp theme={null}
SetDriverHintX(DRIVER_HINT_SET_DYNAMIC_POWER, 1);
// 또는:
SetDriverHintX(0xEFF1C1E7, 1);
```

### DPS 비활성화

```cpp theme={null}
SetDriverHintX(DRIVER_HINT_SET_DYNAMIC_POWER, 0);
// 또는:
SetDriverHintX(0xEFF1C1E7, 0);
```

DPS는 게임 플레이 중에도 토글할 수 있지만, 항상 활성화된 상태로 두는 것이 최대 절감을 제공합니다.

<Warning>
  게임이 DPS를 토글한다면 **PLM `Resume()` 핸들러에서 원하는 값을 다시 설정하세요**. DPS 상태는 Suspend/Resume 전후에 보존되지 않습니다.
</Warning>

## 프레임 통계로 런타임에서 DPS 감지하기

게임은 프레임 통계를 조회하여 DPS 동작에 따라 렌더링 결정(동적 해상도 등)을 내릴 수 있습니다.

### GetFrameStatisticsX

새로운 프레임 통계 유형이 제공됩니다.

```cpp theme={null}
D3D12XBOX_FRAME_STATISTICS_TYPE_POWERSCALING
```

그리고 관련 구조체:

```cpp theme={null}
typedef struct D3D12XBOX_POWERSCALING_STATISTICS
{
    UINT8 PlaneIndex;
    UINT64 GPUBusyDurationScaled;
    double ScaleFactor;
} D3D12XBOX_POWERSCALING_STATISTICS;
```

기존 `D3D12XBOX_RENDER_STATISTICS`는 `GPUBusyDuration`을 반환합니다.

```cpp theme={null}
typedef struct D3D12XBOX_RENDER_STATISTICS
{
    UINT8 PlaneIndex;
    UINT64 GPUWriteCompleteTime;
    UINT64 GPUBusyDuration;
} D3D12XBOX_RENDER_STATISTICS;
```

`GPUBusyDuration`은 **정규화**된 값이며, GPU 클럭이 P4에 있다고 가정하고 현재 전력 상태와 무관합니다. 전력 스케일링 프레임 통계는 전력 상태 변경의 영향을 **받으며**, `GPUBusyDuration`과 다른 값을 갖습니다.

### 예시

P4에서 8 ms 걸리는 GPU 워크로드가 P2(더 낮은 클럭)에서는 12 ms로 늘어난다고 가정합니다.

| 값                       | DPS OFF (P4) | DPS ON (P2) |
| ----------------------- | ------------ | ----------- |
| `GPUBusyDuration`       | 8 ms         | 8 ms        |
| `GPUBusyDurationScaled` | 8 ms         | 12 ms       |
| `ScaleFactor`           | 1            | 0.67        |

<Note>
  정규화된 `GPUBusyDuration`은 게임 엔진이 동적 해상도 계산에 사용하기 때문에 그대로 유지됩니다. **정규화**된 측정값과 **스케일된** 측정값을 분리함으로써, 더 낮은 전력 상태가 동적 해상도를 최저치에 도달할 때까지 계속 낮추게 만드는 피드백 루프를 방지합니다.
</Note>

## 다음 단계

* [지속 가능성 프로파일링을 위한 PIX 사용 방법](/build/game-principles/sustainability/sustainability-pix-guide)
* [지속 가능성 개발자 개요](/build/game-principles/sustainability/sustainability-developer-overview)
* [지속 가능성 devkit 가이드](/build/game-principles/sustainability/sustainability-devkit-guide)
* [에너지 효율 필수 요소](/build/game-principles/sustainability/energy-efficiency-essentials)
