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

# Map

> リソース内の指定されたサブリソースへの CPU ポインターを取得しますが、そのポインター値をアプリケーションに開示しない場合があります。Map は CPU キャッシュも無効化します。

リソース内の指定されたサブリソースへの CPU ポインターを取得しますが、そのポインター値をアプリケーションに開示しない場合があります。**Map** は、GPU によって加えられた変更が CPU からのこのアドレスへの読み取りに反映されるように、必要に応じて CPU キャッシュも無効化します。

## 構文

```cpp theme={null}
HRESULT Map(
    UINT Subresource,
    const D3D12_RANGE  pReadRange,
    void  ppData
)
```

### パラメーター

*Subresource*<br />型: UINT

サブリソースのインデックス番号を指定します。

*pReadRange \[in, optional]*<br />型: const D3D12\_RANGE \*

アクセスするメモリ範囲を記述する [D3D12\_RANGE](/reference/graphics/d3d12/structs/d3d12_range_public) 構造体へのポインター。

これは CPU が読み取る可能性のある領域を示し、座標はサブリソース相対です。null ポインターは、CPU がサブリソース全体を読み取る可能性があることを示します。**End** が **Begin** 以下となる範囲を渡すことで、CPU がデータを読み取らないことを指定することも有効です。

*ppData \[out, optional]*<br />型: void \*\*

リソース データへのポインターを受け取るメモリ ブロックへのポインター。

null ポインターも有効であり、[WriteToSubresource](/reference/graphics/d3d12/interfaces/id3d12resource/methods/id3d12resource_writetosubresource_public) のようなメソッド用に CPU 仮想アドレス範囲をキャッシュするのに便利です。<i>ppData</i> が NULL でない場合、返されるポインターは <i>pReadRange</i> の値によってオフセットされることはありません。

### 戻り値

型: HRESULT

このメソッドは、[Direct3D 12 のリターン コード](https://learn.microsoft.com/en-us/windows/desktop/direct3d12/d3d12-graphics-reference-returnvalues) のいずれかを返します。

## 解説

**Map** および [Unmap](/reference/graphics/d3d12/interfaces/id3d12resource/methods/id3d12resource_unmap_public) は、複数のスレッドから安全に呼び出せます。ネストされた **Map** 呼び出しがサポートされ、参照カウントされます。**Map** への最初の呼び出しでリソースの CPU 仮想アドレス範囲が割り当てられます。**Unmap** の最後の呼び出しで CPU 仮想アドレス範囲が解放されます。CPU 仮想アドレスは通常アプリケーションに返されます。ただし、レイアウトが不明なテクスチャの内容を操作する場合は、CPU 仮想アドレスを開示することはできません。詳細については [WriteToSubresource](/reference/graphics/d3d12/interfaces/id3d12resource/methods/id3d12resource_writetosubresource_public) を参照してください。アプリケーションは、**Map** が永続的にネストされていない限り、アドレスの一貫性に依存できません。

**Map** によって返されるポインターは、通常のポインターのすべての機能を持つことは保証されませんが、ほとんどのアプリケーションは通常の使用で違いに気付くことはありません。たとえば、WRITE\_COMBINE の動作を持つポインターは、WRITE\_BACK の動作に比べて CPU メモリ順序の保証が弱くなります。CPU と GPU の両方からアクセスできるメモリは、PCIe の制限により、CPU が持つ同じアトミック メモリ保証を共有することは保証されていません。同期にはフェンスを使用してください。

**Map** の使用モデルには、シンプルと高度の 2 つのカテゴリーがあります。シンプルな使用モデルはツールのパフォーマンスを最大化するため、アプリケーションでは、高度モデルが必要であることが判明するまで、シンプル モデルに従うことが推奨されます。

<h3><a id="Simple_Usage_Models" /><a id="simple_usage_models" /><a id="SIMPLE_USAGE_MODELS" />シンプルな使用モデル</h3> アプリケーションは、すべてのアダプター アーキテクチャを合理的にサポートするために、UPLOAD、DEFAULT、READBACK のヒープ タイプ抽象化に従うべきです。

アプリケーションは、たとえ偶然でも、UPLOAD ヒープ上のリソースへのポインターからの CPU 読み取りを避けるべきです。CPU 読み取りは機能しますが、多くの一般的な GPU アーキテクチャでは非常に遅いため、以下を考慮してください。

<ul>
  <li>
    D3D12\_HEAP\_TYPE\_UPLOAD であるか、D3D12\_CPU\_PAGE\_PROPERTY\_WRITE\_COMBINE を持つヒープに関連付けられたリソースから CPU に読み取らせないでください。
  </li>

  <li>
    **pData** が指すメモリ領域は [PAGE\_WRITECOMBINE](https://learn.microsoft.com/en-us/windows/desktop/Memory/memory-protection-constants) で割り当てられる可能性があり、アプリはそのようなメモリに関連付けられたすべての制限を守る必要があります。
  </li>

  <li>
    以下の C++ コードでさえも、次の x86 アセンブリ コードに展開される可能性があるため、メモリから読み取ってパフォーマンス上のペナルティを引き起こす可能性があります。

    C++ コード:

    ```
    *((int*)MappedResource.pData) = 0;
    ```

    x86 アセンブリ コード:

    ```
    AND DWORD PTR [EAX],0
    ```
  </li>

  <li>
    このパフォーマンス ペナルティを回避するには、適切な最適化設定と言語構造を使用してください。たとえば、**volatile** ポインターを使用するか、コード サイズではなくコード速度に対して最適化することで、xor の最適化を回避できます。
  </li>
</ul>

アプリケーションは、CPU が変更しない間はリソースをアンマップされたままにし、常に厳密で正確な範囲を使用することが推奨されます。これにより、[グラフィックス デバッグ](https://learn.microsoft.com/en-us/visualstudio/debugger/visual-studio-graphics-diagnostics) やデバッグ層などのツールで最も高速なモードが有効になります。こうしたツールは、GPU が読み取る可能性のあるメモリに対する CPU のすべての変更を追跡する必要があります。

<h3><a id="Advanced_Usage_Models" /><a id="advanced_usage_models" /><a id="ADVANCED_USAGE_MODELS" />高度な使用モデル</h3> CPU アクセス可能なヒープ上のリソースは、永続的にマップできます。つまり、リソース作成の直後に **Map** を一度だけ呼び出すことができます。[Unmap](/reference/graphics/d3d12/interfaces/id3d12resource/methods/id3d12resource_unmap_public) を呼び出す必要はありませんが、**Map** から返されたアドレスは、リソースへの最後の参照が解放された後は使用してはなりません。永続マップを使用する場合、アプリケーションは、GPU がそのメモリを読み書きするコマンド リストを実行する前に、CPU がメモリへのデータの書き込みを完了することを保証する必要があります。一般的なシナリオでは、アプリケーションは [ExecuteCommandLists](/reference/graphics/d3d12_x/interfaces/id3d12commandqueue/methods/id3d12commandqueue_executecommandlists) を呼び出す前にメモリに書き込むだけでよいですが、フェンスを使用してコマンド リストの実行を遅らせる方法も機能します。

すべての CPU アクセス可能メモリ タイプは、リソースがマップされてから決してアンマップされない永続マッピング使用をサポートします。ただし、リソースが破棄された後にアプリケーションがポインターにアクセスしないことが条件です。

#### 例

[D3D12Bundles](https://learn.microsoft.com/en-us/windows/desktop/direct3d12/working-samples) サンプルでは、**ID3D12Resource::Map** を次のように使用しています。

三角形データを頂点バッファーにコピーします。

```cpp theme={null}
// Copy the triangle data to the vertex buffer.
UINT8* pVertexDataBegin;
CD3DX12_RANGE readRange(0, 0);        // We do not intend to read from this resource on the CPU.
ThrowIfFailed(m_vertexBuffer->Map(0, &readRange, reinterpret_cast<void**>(&pVertexDataBegin)));
memcpy(pVertexDataBegin, triangleVertices, sizeof(triangleVertices));
m_vertexBuffer->Unmap(0, nullptr);
```

定数バッファー用のアップロード ヒープを作成します。

```cpp theme={null}
// Create an upload heap for the constant buffers.
ThrowIfFailed(pDevice->CreateCommittedResource(
&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD),
D3D12_HEAP_FLAG_NONE,
&CD3DX12_RESOURCE_DESC::Buffer(sizeof(ConstantBuffer) * m_cityRowCount * m_cityColumnCount),
D3D12_RESOURCE_STATE_GENERIC_READ,
nullptr,
IID_PPV_ARGS(&m_cbvUploadHeap)));

// Map the constant buffers. Note that unlike D3D11, the resource
// does not need to be unmapped for use by the GPU. In this sample,
// the resource stays 'permanently' mapped to avoid overhead with
// mapping/unmapping each frame.
CD3DX12_RANGE readRange(0, 0);        // We do not intend to read from this resource on the CPU.
ThrowIfFailed(m_cbvUploadHeap->Map(0, &readRange, reinterpret_cast<void**>(&m_pConstantBuffers)));
```

[D3D12 リファレンスのサンプル コード](https://learn.microsoft.com/en-us/windows/desktop/direct3d12/notes-on-example-code) を参照してください。

<div class="code" />

## 要件

**ヘッダー:** d3d12\_xs.h または d3d12\_x.h<br />**ライブラリ:** d3d12\_xs.lib または d3d12\_x.lib<br />**サポートされているプラットフォーム**: XBOX Series 本体および XBOX One ファミリ

## 関連項目

[ID3D12Resource](/reference/graphics/d3d12_xs/interfaces/ID3D12Resource/id3d12resource_xs)

[サブリソース](https://learn.microsoft.com/en-us/windows/desktop/direct3d12/subresources)

[Unmap](/reference/graphics/d3d12/interfaces/id3d12resource/methods/id3d12resource_unmap_public)


## Related topics

- [XMemMapPhysicalPages](/ja-jp/reference/system/xmem/functions/xmemmapphysicalpages.md)
- [ApuMapApuAddress](/ja-jp/reference/audio/apu/functions/apumapapuaddress.md)
- [ApuMapVirtualAddress](/ja-jp/reference/audio/apu/functions/apumapvirtualaddress.md)
- [XMemMapPhysicalPagesScatter](/ja-jp/reference/system/xmem/functions/xmemmapphysicalpagesscatter.md)
- [CopyTileMappings](/ja-jp/reference/graphics/d3d12/interfaces/id3d12commandqueue/methods/id3d12commandqueue_copytilemappings_public.md)
