> ## 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 物件。

```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;
}
```

此表格提供標準軟體 zlib 解壓縮器與硬體
解壓縮器的時間測量結果，測量環境為以 3.8GHz 執行的 XBOX Series X|S，並使用 ASCII 文字作為來源緩衝區。
不同的壓縮比會產生不同的交叉點，決定軟體與硬體何者較快。
您應進行分析，以找出相對於您的軟體解壓縮器與內容的最佳交叉點大小。

區塊大小以位元組為單位，時間以微秒為單位。

| **區塊大小** | **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

- [安裝 GDK 工具鏈](/zh-TW/home/setup-install/download-install.md)
- [NDA 主題目錄 - Microsoft Learn 線上連結](/zh-TW/nda/nda-topic-directory.md)
- [簡易なハードウェア展開](/ja-jp/build/console-features/storage/directstorage/directstorage-drop-in-decompression.md)
- [存取 GDK 資源與下載](/zh-TW/home/onboarding-access/access-resources.md)
- [GDK 被授權人的安全性要求](/zh-TW/home/onboarding-access/security-requirements.md)
