これは、CDのロードされたレベルのファイルを驚くほど短時間で作成したファイルシステムを思い出させます(ロード時間が数十秒からほぼ瞬時に改善されました)。CD以外のメディアでも機能します。これは、ファイルIO関数をラップするためのクラスの3つのバージョンで構成され、すべて同じインターフェイスを備えています。
class IFile
{
public:
IFile (class FileSystem &owner);
virtual Seek (...);
virtual Read (...);
virtual GetFilePosition ();
};
および追加のクラス:
class FileSystem
{
public:
BeginStreaming (filename);
EndStreaming ();
IFile *CreateFile ();
};
そして、次のような読み込みコードを記述します。
void LoadLevel (levelname)
{
FileSystem fs;
fs.BeginStreaming (levelname);
IFile *file = fs.CreateFile (level_map_name);
ReadLevelMap (fs, file);
delete file;
fs.EndStreaming ();
}
void ReadLevelMap (FileSystem &fs, IFile *file)
{
read some data from fs
get names of other files to load (like textures, object definitions, etc...)
for each texture file
{
IFile *texture_file = fs.CreateFile (some other file name)
CreateTexture (texture_file);
delete texture_file;
}
}
次に、デバッグモード、ストリームファイルビルドモード、リリースモードの3つの操作モードがあります。
各モードで、FileSystemオブジェクトは異なるIFileオブジェクトを作成します。
デバッグモードでは、IFileオブジェクトは標準のIO関数をラップしただけです。
ストリームファイルの構築では、IFileオブジェクトも標準IOをラップしましたが、読み取られたバイトごとにストリームファイル(所有者のFileSystemがストリームファイルを開いた)に書き込み、ファイルポインター位置クエリの戻り値を書き込む追加機能がありました。 (したがって、ファイルサイズを知る必要がある場合は、その情報がストリームファイルに書き込まれます)。これにより、さまざまなファイルが1つの大きなファイルに連結されますが、実際に読み取られたデータのみが連結されます。
リリースモードでは、ファイルを開かず、ファイル内をシークせず、ストリーミングファイルから読み取るだけのIFileが作成されます(所有者のFileSystemオブジェクトによって開かれます)。
これは、リリースモードでは、すべてのデータが、大量のシークと読み取りではなく、1つの連続した一連の読み取りで読み取られることを意味します(OSはそれを適切にバッファリングします)。これは、シーク時間が非常に遅いCDに最適です。言うまでもなく、これはCDベースのコンソールシステム用に開発されました。
副作用として、通常はスキップされる不要なメタデータがデータから削除されます。
これには欠点があります。レベルのすべてのデータが1つのファイルにあります。これらは非常に大きくなる可能性があり、データをファイル間で共有することはできません。たとえば、2つ以上のレベルで共通のテクスチャのセットがある場合、データは各ストリームファイルに複製されます。また、データがロードされるたびにロードプロセスが同じである必要があり、条件付きでスキップしたり、レベルに要素を追加したりすることはできません。