Это напоминает мне о файловой системе, которую я придумал, чтобы загружать файлы уровня компакт-диска за удивительно короткое время (это улучшило время загрузки с 10 секунд до почти мгновенного), и она также работает на носителях, отличных от компакт-дисков. Он состоял из трех версий класса для переноса функций файлового ввода-вывода с одинаковым интерфейсом:
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;
}
}
Тогда у вас будет три режима работы: режим отладки, режим сборки потокового файла и режим выпуска.
В каждом режиме объект FileSystem будет создавать разные объекты IFile.
В режиме отладки объект IFile просто обертывает стандартные функции ввода-вывода.
При построении потокового файла объект IFile также обертывал стандартный ввод-вывод, но имел дополнительные функции записи в потоковый файл (владелец файловой системы открывал потоковый файл) каждого прочитанного байта и записи возвращаемого значения любых запросов позиции указателя файла. (поэтому, если что-то нужно знать размер файла, эта информация записывается в файл потока). Это как бы объединяет различные файлы в один большой файл, но только те данные, которые были фактически прочитаны.
В режиме выпуска создается IFile, который не открывает файлы и не выполняет поиск в файлах, а просто считывает из потокового файла (открытого владельцем объекта FileSystem).
Это означает, что в режиме деблокирования все данные считываются за одну последовательную серию операций чтения (ОС хорошо буферизует их), а не за множество операций поиска и чтения. Это идеально подходит для компакт-дисков, где время поиска очень медленное. Излишне говорить, что это было разработано для консольной системы на основе компакт-диска.
Побочным эффектом является то, что данные удаляются из ненужных метаданных, которые обычно пропускаются.
У него есть недостатки - все данные для уровня находятся в одном файле. Они могут быть довольно большими, и данные не могут быть разделены между файлами, если у вас есть набор текстур, скажем, общих для двух или более уровней, данные будут дублироваться в каждом файле потока. Кроме того, процесс загрузки должен быть одинаковым каждый раз при загрузке данных, вы не можете условно пропускать или добавлять элементы на уровень.
person
Skizz
schedule
23.08.2011