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

# Descompresión de hardware sencilla

> Descompresión de hardware sencilla

Las consolas XBOX Series admiten la descompresión de hardware para contenido
comprimido con zlib mediante DirectStorage. Aquí se proporciona un reemplazo
directo de la función `inflate` estándar de software de zlib. El uso de este código puede permitir a un
desarrollador agregar compatibilidad con la descompresión de hardware acelerada con el
mínimo número de cambios en su código. Proporcionará una mejora
inmediata en los tiempos de descompresión y, al mismo tiempo, liberará recursos de CPU
que se pueden usar para otro trabajo.

Se necesita una inicialización única para crear los objetos de DirectStorage
que se usan para la descompresión de hardware.

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

La descompresión de hardware tiene un costo mínimo de configuración; debido a esto, puede ser más rápido
usar la descompresión de software para tamaños de bloque más pequeños. A continuación se proporciona una tabla de tiempos usando
texto ASCII como búfer de origen. Debe generar perfiles para encontrar el mejor tamaño de cruce con respecto a su descompresor de software y su contenido.

En este código se supone que el contenido comprimido se ajusta
al estándar zlib [IETF RFC 1950](https://www.ietf.org/rfc/rfc1950.txt)
compatible. Consulte [Optimización de contenido comprimido mediante DirectStorage
y XBTC
(microsoft.com)](https://developer.microsoft.com/games/xbox/docs/gdk/directstorage-compression)
para obtener más detalles.

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

En esta tabla se proporciona una medición de los tiempos del descompresor de software zlib estándar frente al descompresor
de hardware de una XBOX Series X|S que se ejecuta a 3.8 GHz usando texto ASCII como búfer de origen.
Diferentes relaciones de compresión crearán diferentes puntos de cruce en cuanto a cuál es más rápido entre software y hardware.
Debe generar perfiles para encontrar el mejor tamaño de cruce con respecto a su descompresor de software y su contenido.

El tamaño de bloque está en bytes y los tiempos están en microsegundos.

| **Tamaño de bloque** | **Tiempo de CPU** | **Tiempo de hardware** |
| -------------------- | ----------------- | ---------------------- |
| 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                 |
