圧縮は多くの異なるレイヤーでさまざまな方法で発生する可能性があり、いつ、どこで、どのように使用されるかは、その目的と目標が何であるかに完全に依存します (圧縮は常にディスク上のスペースを節約することではありません)。
非常に基本的に、最上位レベルでは、すべてのアセットを一括アーカイブに圧縮する/圧縮することができます (これにより、HDD から読み取るものが少なくなるため読み取りが高速化されますが、DMA を使用してCPU をまったく使用しない圧縮されていないファイルの読み取り)、読み取りはほとんど常にメモリからメモリへ行われ、HDD への読み取りはパフォーマンスを低下させ、多くの問題を引き起こします (場合によっては、古い世代のコンソールで)。
2 番目の層はアセット自体で実行できます。例として、テクスチャはさまざまな方法で圧縮できますが、最近では主にブロック圧縮 (S3TC/DXTn、BCn) が使用されます。これは、その解凍がハードウェア (またはドライバーによってエミュレートされます)、そのため、アーカイブ/ディスクを読み取った後は、それ以上の解凍を行う必要はありません。
圧縮戦略もプラットフォームごとに異なります。特に、メモリ レイアウトに非常に敏感で、リソースが限られており、キャッシュが小さいコンソールなどでは異なります。
c++ で zlib (またはその他) のようなライブラリを使用すると、この実行時の圧縮解除はどのように行われますか?
一般に、アーカイブのメモリ マップ ファイルを使用し、RAM に直接解凍します。これを行うことが十分に文書化されている AAA アーカイブ システムの良い例は、MPQ 形式です(Blizzard Entertainment で使用されています。詳細はこちら)。 Diablo I の deflate、Warcraft III の zlib、World of Warcraft の bzip2 などのさまざまな圧縮アルゴリズムがあり、最近では SCII などの新しいゲームに LZ とスパース圧縮が追加されました。
Jan Wassenberg の論文 ( Optimizing File Accesses via Ordering and Caching
) には、ファイル管理の詳細な内訳があり、これも興味深いかもしれません。