2012-06-29 5 views
7

私はゲームエンジンは、資産の圧縮に対処する方法を見つけるためにしようとしています。明らかに、彼らはゲームを構築するときにすべての資産を圧縮します。しかし、実行時にそれらをどのように解凍するのですか?私が考えることができる唯一のことは、記憶を解凍することでしたが、それは非常にメモリ集中的でなければなりません。彼らがHDDに解凍した場合、ゲームのプレイ中にフォルダがいっぱいになるでしょうか?これは非常に効率的に聞こえません。 C++とのzlib(またはその他)のようなライブラリを使用してゲームエンジンのランタイム解凍

、どのようにこのランタイム解凍が行われていますか?資産圧縮と

デビッド

+2

私は知りません見つけることができ、彼はこの全体のプロセスを説明しQuakeCon 2011で基調講演を持っていたもの'asset'はここで具体的に意味しますが、別々の圧縮ファイルがたくさんある場合は、オンデマンドで圧縮解除してみてください。したがって、ファイルは必要なときにのみメモリ内で解凍され、キャッシュされます。キャッシュが大きくなりすぎないように、他のファイルを解凍する必要があるときには、キャッシュから不要なファイルを破棄します。 – sashoalm

+0

アセット私はゲームに必要なファイル、イメージ、メッシュ、マテリアル、シェイダーなどのものを意味します。 – Constan7ine

+0

"Game Coding Complete"には、記述された方法がかなりありました。 – risingDarkness

答えて

9

それはこのようにちょっとだ、あなたが一度にメモリ内にそれらのすべてを読み込むことができないので、それは、メモリの合理的な量に収まらないほど多くのデータでゲームを持っているので、あなたがのために、いくつかのバッファを定義しますキャッシュとして使用するデータ。

最低から最高の速度の順で

今、メモリがあるような:

  • DVD
  • ハードドライブ
  • あなたからデータをストリームする必要はありません。理想的には

RAM DVDなどがありますが、たとえばコンソールゲームをする必要がある場合は、これを考慮する必要があります。したがって、これらの使用可能な記憶域のそれぞれについて、キャッシュとして使用されるバッファーを定義します。

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

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

ジョンKarmackは多分少しは(他の素晴らしいものの間)の記事で私ができるよりも良い、あなたはそれがhere

+0

あなたの優れた答えはありがとうございます! – Constan7ine

0

ゲームエンジンの契約

、このような幾何学モデル(三角測量/ポリゴンモデル)、テクスチャなどの各資産クラスが別のを持っているなど、さまざまなゲームエンジンの資産があります。圧縮戦略。あなたはもっと具体的になりますか?モデルの圧縮のための

Check this

+0

Okはテクスチャを言うことができます。私がこれを言う理由は、私が以前に作業したエンジンが、ほぼすべてを圧縮して、実行時に使用する1つまたは2つのファイルに見えるからです。 – Constan7ine

+0

私はあなたがこれを見るべきだと思います:http://www.webpronews.com/google- talks-texture-compression-for-gdc-2012-03 – Ram

3

圧縮は、多くの異なる層に多くの方法で起こる、いつ、どこで、どのようにその使用の目的&目標は(圧縮がスペースを節約について常にではないが何であるか、完全に依存していることができますディスク上に)。

非常に基本的に、すべてのアセットは一括アーカイブに圧縮されます(これにより、HDDからの読み込みが少なくなるため読み込みが高速化されますが、これに対して処理能力を犠牲にしていますまったくCPUを使用していない非圧縮ファイルを、)読み取るためにDMAを使用して、ほとんど常にパフォーマンスを破壊し、問題のホストを引き起こすバックHDDに読み取りが(場合によってはなり、メモリへの記憶を行われているリードバック不可能な、古い世代のコンソールなど)。

例として、テクスチャはさまざまな方法で圧縮できますが、主にブロック圧縮(S3TC/DXTn、BCn)は圧縮解除がサポートされているため使用されています(またはドライバによってエミュレートされる)ので、アーカイブ/ディスクのための読み込みが完了したら、それ以上の解凍は必要ありません。

圧縮戦略はまた、特に、メモリレイアウトに非常に敏感である限られた資源を持っているとCとのzlibなどのライブラリー(またはその他)を使用するなど

小さなキャッシュを持っているコンソールで、プラットフォームごとに異なり++この実行時圧縮解除はどのように行われますか?

一般的には、メモリはアーカイブのファイルをマッピングし使用してRAMに直接解凍したい、これを行い十分に立証されてAAAアーカイブシステムの良い例はブリザードエンターテイメントが使用するMPQ format(、より詳細hereです)、そのようなディアブロI、ウォークラフトIII、World of Warcraftの中にbzip2のためのzlibのためのデフレートとして、圧縮ALGOSの様々なを使用し、彼らは最近、SCIIような彼らの新しいゲームのためのLZとスパース圧縮を追加しました。

月ヴァッセンベルク」論文(Optimizing File Accesses via Ordering and Caching)も、興味のあるファイル管理の良い内訳を、持っています。