> ## 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 Series コンソールは、DirectStorage を使用した zlib 圧縮コンテンツのハードウェア展開をサポートしています。ここでは、標準のソフトウェア zlib `inflate` 関数のドロップイン置換を提供します。このコードを使うことで、開発者は最小限のコード変更で高速化されたハードウェア展開のサポートを追加できます。展開時間が即座に改善されるとともに、他の処理に使える CPU リソースを解放できます。

ハードウェア展開に使用する DirectStorage オブジェクトを作成するために、1 回だけの初期化が必要です。

```cpp theme={null}
Microsoft::WRL::ComPtr<IDStorageFactoryX> inflateDropInFactory;
Microsoft::WRL::ComPtr<IDStorageQueueX> inflateDropInQueue;
Microsoft::WRL::ComPtr<IDStorageStatusArrayX> inflateDropInStatus;

void CreateDSObjects()
{
    DX::ThrowIfFailed(DStorageGetFactory(__uuidof(IDStorageFactoryX), (void**)(inflateDropInFactory.ReleaseAndGetAddressOf())));
    DSTORAGE_QUEUE_DESC queueDesc = {};
    queueDesc.SourceType = DSTORAGE_REQUEST_SOURCE_MEMORY;
    queueDesc.Priority = DSTORAGE_PRIORITY_REALTIME;
    queueDesc.Capacity = DSTORAGE_MIN_QUEUE_CAPACITY;
    inflateDropInFactory->CreateQueue(&queueDesc, __uuidof(IDStorageQueueX), (void**)(inflateDropInQueue.ReleaseAndGetAddressOf()));
    inflateDropInFactory->CreateStatusArray(1, nullptr, __uuidof(IDStorageStatusArrayX), (void**)(inflateDropInStatus.ReleaseAndGetAddressOf()));
}
```

ハードウェア展開には最小限のセットアップ コストが伴います。このため、小さなブロック サイズではソフトウェア展開の方が高速になる場合があります。ソース バッファーとして ASCII テキストを使用した時間の表を以下に示します。ソフトウェア展開器とコンテンツに対する最適なクロスオーバー サイズを見つけるには、プロファイリングを行ってください。

このコードでは、圧縮コンテンツがサポート対象の [IETF RFC 1950](https://www.ietf.org/rfc/rfc1950.txt) の zlib 標準に準拠していることを前提としています。詳細は [DirectStorage と XBTC を使用した圧縮コンテンツの最適化 (microsoft.com)](https://developer.microsoft.com/games/xbox/docs/gdk/directstorage-compression) を参照してください。

```cpp theme={null}
int inflateDropIn(z_streamp strm, int flush)
{
    bool fallback(false);
    if (strm->avail_out <= strm->total_in)
        fallback = true;
    if (flush != Z_FINISH)
        fallback = true;
    if (strm->avail_out < c_hardwareSizeCrossOverSize)
        fallback = true;
    if (fallback)
        return inflate(strm, flush);

    DSTORAGE_REQUEST request = {};
    request.Options.ZlibDecompress = true;
    request.Options.SourceType = DSTORAGE_REQUEST_SOURCE_MEMORY;
    request.Source = strm->next_in;
    request.SourceSize = strm->total_in;
    request.Destination = strm->next_out;
    request.DestinationSize = strm->avail_out;
    inflateDropInQueue->EnqueueRequest(&request);
    inflateDropInQueue->EnqueueStatus(inflateDropInStatus.Get(), 0);
    inflateDropInQueue->Submit();
    while (!inflateDropInStatus->IsComplete(0))
    {
        _mm_pause();
    }
    return Z_STREAM_END;
}
```

以下の表は、ソース バッファーに ASCII テキストを用いた場合の、標準のソフトウェア zlib 展開器と、3.8GHz で動作する XBOX Series X|S 上のハードウェア展開器における時間の測定結果です。圧縮率が異なると、ソフトウェアとハードウェアのどちらが速いかのクロスオーバー ポイントも変化します。ソフトウェア展開器とコンテンツに対する最適なクロスオーバー サイズを見つけるには、プロファイリングを行ってください。

ブロック サイズはバイト、時間はマイクロ秒です。

| **ブロック サイズ** | **CPU 時間** | **ハードウェア時間** |
| ------------ | ---------- | ------------ |
| 128          | 2.91       | 75.39        |
| 256          | 3.67       | 65.29        |
| 512          | 4.14       | 65.54        |
| 1,024        | 5.59       | 66.63        |
| 2,048        | 7.65       | 66.29        |
| 4,096        | 10.96      | 83.93        |
| 8,192        | 13.69      | 69.04        |
| 10,240       | 15.08      | 67.09        |
| 12,288       | 16.16      | 67.66        |
| 14,336       | 17.37      | 70.58        |
| 16,384       | 18.40      | 72.56        |
| 20,480       | 20.58      | 70.34        |
| 24,576       | 22.88      | 71.52        |
| 28,672       | 25.34      | 71.34        |
| 32,768       | 27.71      | 73.03        |
| 36,864       | 29.73      | 72.35        |
| 40,960       | 31.56      | 77.67        |
| 45,056       | 34.34      | 73.22        |
| 65,536       | 46.76      | 76.69        |
| 131,072      | 83.96      | 89.13        |
| 262,144      | 158.32     | 111.58       |
| 524,288      | 308.01     | 177.95       |


## Related topics

- [DirectStorage の概要](/ja-jp/build/console-features/storage/directstorage/directstorage-overview.md)
- [ハードウェア開発者向け GameInput](/ja-jp/build/core-features/common/input/hardware/input-hardware-topics.md)
- [XBOX Series X|S オーディオ ハードウェアの概要](/ja-jp/build/console-features/audio/overviews/scarlett-audio.md)
- [CreateForceFeedbackEffect](/ja-jp/reference/input/gameinput/interfaces/igameinputdevice/methods/igameinputdevice_createforcefeedbackeffect.md)
- [XBOX GDK タイトル向けの入力 API とハードウェア](/ja-jp/build/core-features/common/input/index.md)
