> ## 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 を出荷しました。

> エネルギー効率を最大化するため、Dynamic Power States を Constrained+ モードと併せてテストしました。これらの機能により、**メイン メニューで約 50〜58%** の消費電力削減、constrained モード中で **39〜63%** のエネルギー使用量削減が実現しました。ロールアウト以降、ゲームプレイの忠実度を損なうことなく、平均エネルギー消費量に顕著な減少が見られました。たとえば、XBOX Series X の消費電力は平均 **135 W から 125 W** に減少しました。プレイヤー全体では、これは年間 **約 6.5 メガワット時** のエネルギー削減に相当し、テレビを 65,000 時間、つまり約 7.5 年間ぶっ通しで視聴するのと同等のエネルギー量です。

Two Point Museum は、クラウド構成を通じてリモートで DPS を採用した最初のサード パーティ スタジオです。

## コードを変更せずに DPS をテストする（開発時のみ）

タイトルをリビルドすることなく、devkit で DPS をグローバルに有効化できます：

<Steps>
  <Step title="devkit をアップデートする">
    devkit に少なくとも **August 2024 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 power state** メトリック（0〜4）が表示されます。**4** はフル スピード、それより低い値はエネルギー節約を示します。
* DPS が無効の場合、GPU power state は `N/A` と表示されます。

PIX の **Power Load %** メトリックを使用して、ゲームの特定部分における GPU エネルギー使用量の変化を測定できます。

<Warning>
  タイトルは、`DynamicPowerEnable` ファイルを用いてリテールで DPS を有効化することは **できません**。リテール リリースには、下記の `SetDriverHintX` を使用してください。
</Warning>

## ゲームで DPS を有効にする（リテール）

グラフィックス デバイス上の既存 API `SetDriverHintX()` を使用します。

### API

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

**June 2024 GDK** 以降では、次の列挙型を使用します。

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

**June 2024 より前の 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)


## Related topics

- [XBOX Game エネルギー効率化の基本](/ja-jp/build/game-principles/sustainability/energy-efficiency-essentials.md)
- [サステナビリティ概要](/ja-jp/build/game-principles/sustainability/sustainability-overview.md)
- [PIX を使ったサステナビリティ プロファイリング](/ja-jp/build/game-principles/sustainability/sustainability-pix-guide.md)
- [サステナビリティ ケース スタディ概要](/ja-jp/build/game-principles/sustainability/case-studies/case-studies-overview.md)
- [Gears of War: Reloaded ケース スタディ](/ja-jp/build/game-principles/sustainability/case-studies/case-studies-gears-of-war-reloaded.md)
