Привет всем.
Есть возможность загружать ресурсы из файла и из архива, как это можно красиво реализовать?
Пока сделал так:
class Resource { public: virtual bool load(const char* location, const char* fileName, const char* archiveName = NULL); virtual bool save( const char* location, const char* fileName, const char* archiveName = NULL) const; }; // пример использования: Image image; if ( image.load( "Data/images/", "image1.png", "D:/data.zip")) { ... } // или if ( image.load( "D:/data/", "image1.png")) { ... }
MyFile::Ptr pFile = g_pMyFileSystem->Open( "data/images/image1.png" ); if( pFile ) pFile->Read( ... );
Z
Эээ )
nes
Я использую такой формат пути к файлу архива: "D:/data.zip|Data/images/image1.png"
nes
Что?
/A\
Ужос.
/A\
Хотелось обойтись без парсинга пути к файлу.
Z
Загружать файлы я умею )
nes
> Загружать файлы я умею )
Ну, а что больше нужно? Я не вижу никакого смъсла от етого Resource класса.
Z
>Ну, а что больше нужно? Я не вижу никакого смъсла от етого Resource класса.
А так?
Jar* Jar::load(const char* location, const char* fileName, const char* archiveName) { Data data; if ( !JarUtil::loadFile( data, location, fileName, archiveName)) { return NULL; } pugi::xml_document document; if ( !document.load_buffer_inplace( data.getBytes( ), data.getSize( ), pugi::parse_default, pugi::encoding_auto)) { fprintf( stderr, "error: '%s%s' is corrupted in '%s'\n", location, fileName, archiveName); return NULL; } pugi::xml_node rootNode = document.child( "root"); Jar* jar = new Jar; if ( !jar->load( &rootNode)) { jar->release( ); return NULL; } return jar; }
Jar наследуется от Resource
а как избежать множества мелких аллокаций при создании стрима для чтения?
делать пулы на макс. возможное число одновременно открытых стримов?
у меня пока примерно так, но можно считывать и записывать файл только целиком:
struct AResourcePackage { public: // Low-level file access // fast access to file by file handle; // returns BadPakFileHandle if not found; // you don't have to close the returned handle. virtual PakFileHandle GetFile(FileGuidArg fileGuid ) = 0; virtual bool GetFileInfo( FileGuidArg fileGuid, SFileInfo &info ) = 0; // Reads the whole file into the preallocated buffer virtual SizeT ReadFile( PakFileHandle file, void *buffer, SizeT bufferSize ) = 0; // works only in editor mode virtual void UpdateFile( PakFileHandle file, const void* uncompressedData, SizeT size ) = 0; }; чтение: const PakFileHandle file = package->GetFile( fileId ); Assert( file != BadPakFileHandle ); package->ReadFile( file, buffer, sizeof buffer );
Вообще по именам файлов загрузка не кузявая какая-то...
MarkoPolo
Да? Почему?
Z
Потому, что все ресурсы должны лежать в едином memory-mapped файле.
Nomad
Ето зачем ето должнъ? Как на етапе разработки собрать сотни файлов в memory mapped?
Nomad
В чем профит хранить все ресурсы в едином файле?
nes
> Есть возможность загружать ресурсы из файла и из архива, как это можно красиво
> реализовать?
Что значит "красиво"? Зачем нужна "красивая" реализация?
EDIT: каковы требования? почему не устраивает то, что есть сейчас?
Тема в архиве.