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

# メモリ

> GDK メモリ マネージャーが、予測可能なリソース保証を備えた、決定論的で高性能な物理メモリ アクセスを XBOX コンソール ゲームに提供する方法。

## はじめに

複数のアプリケーションを同一のハードウェア上で同時に動作させる必要があるほとんどのコンピューティング用途とは異なり、ゲーム機ではゲームがデバイスのリソースへ排他的にアクセスできるように保証しようとします。ほとんどのコンソールはハイエンドのゲーミング PC より仕様が低いですが、これによりコンソール ゲームはターゲット プラットフォームに合わせて明示的に最適化することが可能となり、生のハードウェア仕様から想像されるものを上回る超高品質な体験を提供できます。

今日、ゲーマーはコストを伴う機能 (特にソーシャル機能やオンライン機能) を期待しており、それらの機能をサポートするにはリソース保証をある程度緩和する必要があります。これにより、XBOX のようなサービスおよびプラットフォーム プロバイダは、ゲーム全体を通じて一貫した方法でそれらの機能を実装できます。

Microsoft Game Development Kit (GDK) は、ゲーム開発者に、高性能で決定論的かつ予測可能な物理メモリへのアクセスを提供します。以前の XBOX One ERA OS のメモリ マネージャーは、ゲーム開発者の多くのニーズを満たしていましたが、改善方法について多くのフィードバックが寄せられました。たとえば、これまでは、ゲーム コードとプラットフォーム サービス間のメモリ リソース共有が、本来あるべき決定論的なものではありませんでした。

私たちは、最も成功していた側面を維持することに配慮しつつ、これらの問題に対処するためにメモリ マネージャーを再構築しました。

新しいアーキテクチャは、ゲーム開発者が望み、期待する、より具体的で決定論的な保証を提供します。このアーキテクチャは、XBOX One ゲームが依拠してきたパフォーマンスの最適化と柔軟性を維持しています。

## アーキテクチャ ダイアグラム

次の図は、Microsoft Game Development Kit (GDK) のメモリ アーキテクチャを示しています。

<img src="https://mintcdn.com/microsoft-4404708b/hRvcUkfcfa4mBzT_/images/gdk/features/console/mem_overview_arch.webp?fit=max&auto=format&n=hRvcUkfcfa4mBzT_&q=85&s=f36ec2f81bad373099d63f9e51bcb013" alt="Microsoft Game Development Kit メモリ アーキテクチャの図" width="1400" height="872" data-path="images/gdk/features/console/mem_overview_arch.webp" />

## 主な機能

* 既存の開発者の知識と専門性の上に構築できるよう、XBOX One ERA システムと大部分において類似:
  * 未初期化メモリとしての 64 KB/2 MB ページ割り当ての最適化を含む
  * `XMemAlloc` API ファミリ
  * 64 KB 単位での物理ページの割り当てとマッピング
* ゲーム コンポーネントと非ゲーム (プラットフォーム) コンポーネント間のメモリ消費の厳格な分離
* タイトル パーティション空間内のすべてのメモリ消費の実行時追跡
* パフォーマンスのために、すべての Win32 ヒープで 2 MB ページを使用

> \[!NOTE] `XMemAlloc` と `XMemFree` の既定の実装のソース コードは、Microsoft Game Development Kit (GDK) の一部としてインストールされます。*\GXDK\gameKit\Source\amd64\heap.c* を参照してください。

## 概要

### メモリ パーティション

Microsoft Game Development Kit (GDK) メモリ アーキテクチャは、XBOX One ERA OS 用に作成された「3 プール」モデルを引き続き採用しています。このアーキテクチャでは、各プールがメモリ使用の特定のカテゴリに対して明示的な所有権を持ちます。

* **システム パーティション:** システム プロセスとプラットフォームの割り当て、およびプラットフォームの実行可能ページを担当
* **タイトル パーティション:** ゲーム プロセスによって駆動されるすべてのメモリ消費と、ゲームの実行可能ページを担当
* **ツール パーティション:** 拡張/デバッグ メモリを製品版メモリから分離するために使用できるオプションのメモリ プール (開発キットでのみ使用可能)

メモリ パーティションは、内部的には OS メモリ マネージャーの一意のインスタンスとして実装されており、各パーティションは物理メモリの専用クォータに対する所有権を持ちます。異なるパーティションは、独自の動作ポリシー (たとえば、ページングやゼロ初期化の動作) を持つこともできます。タイトル パーティションは、ゲーム プロセスに最適なパフォーマンスを提供するように構成されており、その動作は次のようにチューニングされています。

* 通常、割り当て時には、Windows メモリ マネージャはセキュリティ対策としてメモリ ページをゼロで埋めます。タイトル パーティションでは、この機能は無効化されており、そのパフォーマンスをタイトルに返します。

カーネル メモリの使用状況の詳細については、[カーネル メモリの使用量](/build/console-features/memory/kernel_memory_usage) を参照してください。

### タイトルとシステムのメモリ割り当ての分離

Microsoft Game Development Kit (GDK) ゲーム OS は、メモリ パーティションを介してシステムとゲームのメモリ利用の分離を保証します。すべてのプロセスは、起動時にメモリ パーティションが割り当てられます。すべてのシステム プロセスはシステム メモリ パーティション内で起動されるため、これらのプロセスはゲームが使用するタイトル パーティションからメモリを割り当てることはできません。一方、タイトル プロセスはタイトル パーティションを使用し、この専用プールからメモリを取得します。

タイトルとシステム コード間のメモリ割り当ての分離を実現するために、起動時にタイトル プロセスに対していくつかのカスタマイズが適用されます。これには次のようなものが含まれます。

* ファイル システム ミニ フィルター ドライバーが各ファイル マッピングを監視し、ファイルをシステム ファイル (たとえば *kernelbase.dll*) またはゲーム ファイルに分類します。システム ファイルはシステム パーティションに対して割り当てられるようにタグ付けされ、ゲーム ファイルはタイトル パーティションに課金されます。
* システム パーティションとタイトル パーティションの両方に個別の Win32 ヒープが作成され (タイトル ヒープは最初の使用時に作成されます)、それぞれがシステム コードとタイトル コードによって行われたヒープ割り当てを所有します。
* 各モジュールのインポート アドレス テーブルを介して呼び出される割り当て関連の API は、読み込み時に、ソース DLL に応じてシステムまたはタイトル パーティションから割り当てを処理する個別の実装にリダイレクトされます。

その結果、システム パーティションは OS とプラットフォームのバイナリの読み込みコスト、および発生する永続的または一時的なメモリ割り当てのコストを負担することになります。

### タイトルに課金されるメモリ コスト

タイトル パーティションは、引き続き次の項目のコストを負担します。

* ゲーム プロセス固有のコードとデータ/コンテンツのメモリ フットプリント。
* ゲーム プロセスによって読み込まれるモジュールのすべての変更されたデータ セクション (すなわちコピー オン ライト セクション)。
* スレッド スタック領域。
* ゲーム プロセスによる仮想アドレスから物理アドレスへの変換に必要なページ テーブル エントリ。
* システム API 呼び出しに渡されるバッファーを作成するために必要なメモリ。
* システム API 呼び出し、非同期操作、および通知の結果をキャプチャするために必要なメモリ。
* 機能の使用に必要なその他のメタデータ。たとえば、ヒープには割り当てを追跡するためのメタデータが必要です。これらは、ヒープが実行するすべての割り当てに対してタイトル パーティションに課金されます。

### メモリ使用量と割り当て呼び出しの監視

Microsoft Game Development Kit (GDK) メモリ システムには、実行時のメモリ使用量を監視および追跡するための広範なサポートが用意されています。

`XMEM_SET_ALLOCATION_HOOKS` マクロを使用すると、`XMemAlloc` の呼び出しを通じて返されるメモリを追跡できます。さらに、すべての Win32 ヒープ割り当ては、構成された追跡コールバック ([XMemSetWin32HeapTrackingHooks](/reference/system/xmem/functions/xmemsetwin32heaptrackinghooks) を参照) を介して監視でき、`malloc`/`new`/`HeapAlloc` の使用を捕捉できます。

最後に、`XMemGetWorkingSetStatistics` および [XMemVirtualQuery](/reference/system/xmem/functions/xmemvirtualquery) API を使用して、物理および仮想メモリ使用量の詳細なスナップショットを提供できます。[XMemVirtualQuery](/reference/system/xmem/functions/xmemvirtualquery) は `VirtualQuery` に非常に似ていますが、ページ サイズやメモリの所有権 (システムまたはゲーム) など、`VirtualQuery` からは利用できない追加情報を返します。

実行時のメモリ追跡に使用可能な API の詳細については、[Microsoft GDK ゲーム OS メモリ マネージャーを使用するようにタイトルを移植する](/build/console-features/memory/system-memory-porting) の「メモリの追跡」セクションを参照してください。

## パーティション サイズ

このリリースにおける以前のリリースと比較しての大きな変更は、コンソールが、*製品版コンシューマー* 環境でタイトルが体験することが期待されるものと同じメモリ構成を提供するように構成されている点です。

さらに、ツール パーティションのサポートが追加されました。[Microsoft GDK ゲーム OS メモリ マネージャーを使用するようにタイトルを移植する](/build/console-features/memory/system-memory-porting) トピックでは、決定論的なメモリ アカウンティング モデルを提供するために行われた変更について説明しています。開発者は、プラットフォームのバイナリと一時的な割り当てが、タイトルがアドレス指定可能なメモリ空間とは別のシステム メモリ プールに課金されるようにしつつ、コードのために一貫したメモリ プールを保証されるようになりました。

### プロファイル モード

プロファイル モードは、システム OS のリソースの一部をゲームに振り向けるオプションであり、PIX のようなツールが完全な能力で動作するために必要です。Hub Apps、Game DVR、Microsoft Edge などの一部の機能は、プロファイル モードが有効な場合に体験が低下したり、まったく機能しなかったりする可能性があります。これは、XBOX Manager、*xbconfig.exe* (Windows PC 上)、*wdconfig.exe* (コンソール上)、またはコンソール上の開発者ホーム シェルで有効または無効にでき、これらの機能を復元できます。

プロファイル モードが有効な場合、より多くのメモリが必要な場合はオプションでタイトル プールに追加できる、拡張/デバッグ メモリがあります。タイトル空間にメモリを追加するには、次を使用します。

```text theme={null}
  xbconfig ExtraTitleMemory=<value>
```

または、XBOX Manager または開発者ホーム シェルの **\[Extra Title Memory]** 設定のトグルをオンにします。

#### メモリ構成

メモリ構成は次の表で説明されています。

| コンソール タイプ           |              コンソール モード             |      タイトル メモリ モード      |          タイトル メモリ          |                    ツール メモリ |
| :------------------ | :--------------------------------: | :--------------------: | :------------------------: | -------------------------: |
| XBOX One/Xbox One S |                                    |                        |          5,120 MiB         |                  1,012 MiB |
| XBOX One X          |                                    | Standard<br />Advanced |  8,128 MiB<br />9,152 MiB  |  2,024 MiB<br /> 1,012 MiB |
|                     |                                    |                        |                            |                            |
| XBOX One X 開発キット    |        XBOX One / XBOX One S       |                        |          5,120 MiB         |                  5,028 MiB |
| XBOX One X 開発キット    |           XBOX One X test          | Standard<br />Advanced |  8,128 MiB<br />9,152 MiB  |  2,024 MiB<br /> 1,012 MiB |
| XBOX One X 開発キット    |       XBOX One X Devkit \[44]      | Standard<br />Advanced |  8,128 MiB<br />9,152 MiB  | 14,168 MiB<br />13,156 MiB |
|                     |                                    |                        |                            |                            |
| XBOX Series S       |                                    | Standard<br />Advanced |  7,998 MiB<br />8,572 MiB  |                        N/A |
| XBOX Series X       |                                    | Standard<br />Advanced | 10,208 MiB<br />13,312 MiB |                        N/A |
|                     |                                    |                        |                            |                            |
| XBOX Series X 開発キット | Lockhart Profiling (XBOX Series S) | Standard<br />Advanced |  7,998 MiB<br />8,572 MiB  |   6,056 MiB<br />6,048 MiB |
| XBOX Series X 開発キット | Anaconda Profiling (XBOX Series X) | Standard<br />Advanced | 10,208 MiB<br />13,312 MiB |  9,614 MiB<br />15,666 MiB |
| XBOX Series X 開発キット |            Scarlett 40GB           |                        |         37,156 MiB         |                            |

<Note>
  上記の表のツール メモリは、プロファイル モードが有効な場合にのみ使用できます。
</Note>


## Related topics

- [コンソール固有の GDK 機能](/ja-jp/build/console-features/console-features-overview.md)
- [メモリフック](/ja-jp/services/playfab/sdks/c/memory.md)
- [コア間のメモリ コスト](/ja-jp/build/console-features/memory/Cross-Core-Memory-Costs.md)
- [XBOX GDK タイトルのメモリ システム](/ja-jp/build/console-features/memory/index.md)
- [PlayFab 統合 SDK でのメモリ管理](/ja-jp/services/playfab/sdks/unified-sdk/memory-management.md)
