7

私は、ゲーム エンジンがアセットの圧縮をどのように処理するかを調べようとしています。明らかに、ゲームを構築するときにすべてのアセットを圧縮します。しかし、実行時にどのように解凍するのでしょうか。私が考えることができた唯一のことは、メモリに解凍することでしたが、それは非常にメモリ集約的でなければなりません. HDDに解凍した場合、ゲームのプレイ中にフォルダがいっぱいになりますか? これはあまり効率的とは言えません。

c++ で zlib (またはその他) のようなライブラリを使用すると、この実行時の圧縮解除はどのように行われますか?

デビッド

4

3 に答える 3

9

このようなものです。妥当な量のメモリに収まらないほど多くのデータを含むゲームがあり、それらすべてを一度にメモリにロードすることはできません。そのため、データ用にいくつかのバッファを定義します。キャッシュとして使用します。

現在、速度が最低から最高の順にメモリは次のようになります。

  • DVD
  • ハードドライブ

理想的には、DVD からデータをストリーミングする必要はありませんが、たとえばコンソール ゲームを作成する必要がある場合は考慮に入れる必要があります。したがって、これらの使用可能なストレージ スペースごとに、キャッシュとして使用するバッファを定義します。

ゲーム エンジンは、アセットが必要であると判断した場合、まず最速のキャッシュを調べて、アセットが既に読み込まれているかどうかを確認する必要があります。運が良ければ、すぐに送って抽選してもらうことができます。最速のキャッシュにない場合は、ハード ドライブ キャッシュのレベルを下げる必要があります。これは、既に解凍され、メモリにロードする準備ができているアセットを保持するファイルです。最速のキャッシュが完全に占有されていない場合は、データのロードを開始し、準備ができたら使用できます。十分なスペースがない場合は、最初に他のアセットをアンロードする必要があります。新しいアセットをロードするのに十分なスペースができるまで、最近使用されていないアセットを削除することをお勧めします。

ここで、ハード ドライブ キャッシュにデータが読み込まれていない場合は、アーカイブまで 1 つ下のレベルに移動する必要があります。zip ファイル形式では圧縮を解除する必要がないため、zip 形式を使用して圧縮する必要があります。アーカイブ全体で 1 つのファイルのみにアクセスできるようにするには、アーカイブ内でそのファイルのオフセットを見つけて、ハード ドライブ キャッシュに解凍するだけです。繰り返しになりますが、キャッシュがいっぱいになった場合は、他のアセットを最初にアンロードする必要があります。ここでも、使用頻度が最も低いものを削除することをお勧めしますが、パフォーマンスが向上すると思われる場合は、他のアルゴリズムも試すことができます。

John Karmack は QuakeCon 2011 で基調講演を行い、このプロセス全体について、私が記事で説明するよりも少し上手に説明しました (その他のすばらしいことも含めて)。ここで見つけることができます。

于 2012-06-29T09:45:06.110 に答える
3

圧縮は多くの異なるレイヤーでさまざまな方法で発生する可能性があり、いつ、どこで、どのように使用されるかは、その目的と目標が何であるかに完全に依存します (圧縮は常にディスク上のスペースを節約することではありません)。

非常に基本的に、最上位レベルでは、すべてのアセットを一括アーカイブに圧縮する/圧縮することができます (これにより、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) には、ファイル管理の詳細な内訳があり、これも興味深いかもしれません。

于 2012-06-29T09:29:17.763 に答える
0

ゲームエンジンはアセットの圧縮を処理します

ジオメトリ モデル (三角測量/ポリゴン モデル)、テクスチャなど、さまざまなゲーム エンジン アセットがあります。各アセット クラスには、異なる圧縮戦略があります。もっと具体的に言えますか?

モデルの圧縮については、これをチェックしてください

于 2012-06-29T06:53:16.867 に答える