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

# Décompression matérielle simplifiée

> Décompression matérielle simplifiée

Les consoles XBOX Series prennent en charge la décompression matérielle du contenu
compressé avec zlib à l'aide de DirectStorage. Vous trouverez ici un remplacement
direct de la fonction logicielle `inflate` standard de zlib. L'utilisation de ce code permet à un
développeur d'ajouter la prise en charge de la décompression matérielle accélérée avec un
minimum de modifications de son code. Elle apporte une amélioration immédiate
des temps de décompression tout en libérant des ressources processeur
qui peuvent être utilisées pour d'autres tâches.

Une initialisation unique est nécessaire pour créer les objets DirectStorage
utilisés pour la décompression matérielle.

```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 décompression matérielle a un coût de configuration minimal ; de ce fait, il peut être plus rapide
d'utiliser la décompression logicielle pour les blocs de petite taille. Un tableau des temps est fourni ci-dessous, avec
du texte ASCII comme mémoire tampon source. Vous devez effectuer un profilage pour déterminer la taille de bascule optimale par rapport à votre décompresseur logiciel et à votre contenu.

Ce code suppose que le contenu compressé est conforme
à la norme zlib [IETF RFC 1950](https://www.ietf.org/rfc/rfc1950.txt)
prise en charge. Pour plus de détails, consultez [Optimisation du contenu compressé à l'aide de DirectStorage
et 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;
}
```

Ce tableau présente une mesure des temps du décompresseur logiciel zlib standard par rapport au décompresseur
matériel sur une XBOX Series X|S fonctionnant à 3,8 GHz, avec du texte ASCII comme mémoire tampon source.
Des taux de compression différents produisent des points de bascule différents pour déterminer lequel, du logiciel ou du matériel, est le plus rapide.
Vous devez effectuer un profilage pour déterminer la taille de bascule optimale par rapport à votre décompresseur logiciel et à votre contenu.

La taille des blocs est exprimée en octets et les temps en microsecondes.

| **Taille de bloc** | **Temps processeur** | **Temps matériel** |
| - | - | - |
| 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

- [Vue d'ensemble de DirectStorage](/fr/build/console-features/storage/directstorage/directstorage-overview.md)
- [DirectStorage](/fr/build/console-features/storage/directstorage-toc.md)
- [Vue d'ensemble de XMA2](/fr/build/console-features/audio/overviews/xma2-overview.md)
- [Référence de l'outil XBOX Texture Compressor (XBTC)](/fr/build/core-features/graphics/newfeatures/xbtc/index.md)
- [L'architecture audio de XBOX One](/fr/build/console-features/audio/overviews/xbox-one-audio-architecture.md)
