> ## 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 标准。有关更多详情，请参阅 [Optimizing compressed content by using DirectStorage and 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;
}
```

下表提供了在运行于 3.8GHz 的 XBOX Series X|S 上，以 ASCII 文本作为源缓冲区，标准软件 zlib 解压器与硬件解压器的耗时测量。不同的压缩比会导致软件与硬件之间的更快分界点不同。你应对自己的软件解压器和内容进行性能分析，找出最佳分界点。

块大小以字节为单位，耗时以微秒为单位。

| **块大小** | **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 概述](/zh-CN/build/console-features/storage/directstorage/directstorage-overview.md)
- [DirectStorage](/zh-CN/build/console-features/storage/directstorage-toc.md)
- [XMA2 概述](/zh-CN/build/console-features/audio/overviews/xma2-overview.md)
- [XBOX Texture Compressor (XBTC) 工具参考](/zh-CN/build/core-features/graphics/newfeatures/xbtc/index.md)
- [概述](/zh-CN/build/console-features/audio/overviews/index.md)
