ПрограммированиеФорумОбщее

Загрузка ресурсов из файла или архива

Страницы: 1 2 Следующая »
#0
18:24, 21 дек 2011

Привет всем.

Есть возможность загружать ресурсы из файла и из архива, как это можно красиво реализовать?
Пока сделал так:

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"))
{
   ...
}
#1
18:42, 21 дек 2011
MyFile::Ptr pFile = g_pMyFileSystem->Open( "data/images/image1.png" );
if( pFile )
  pFile->Read( ... );
#2
18:48, 21 дек 2011

Z
Эээ )

#3
18:52, 21 дек 2011

nes
Я использую такой формат пути к файлу архива: "D:/data.zip|Data/images/image1.png"

#4
18:53, 21 дек 2011

nes
Что?

/A\
Ужос.

#5
18:58, 21 дек 2011

/A\
Хотелось обойтись без парсинга пути к файлу.

Z
Загружать файлы я умею )

#6
19:16, 21 дек 2011

nes
> Загружать файлы я умею )
Ну, а что больше нужно? Я не вижу никакого смъсла от етого Resource класса.

#7
19:26, 21 дек 2011

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

#8
22:35, 21 дек 2011

а как избежать множества мелких аллокаций при создании стрима для чтения?
делать пулы на макс. возможное число одновременно открытых стримов?

у меня пока примерно так, но можно считывать и записывать файл только целиком:

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 );
#9
22:54, 21 дек 2011

Вообще по именам файлов загрузка не кузявая какая-то...

#10
23:08, 21 дек 2011

MarkoPolo
Да? Почему?

#11
2:02, 22 дек 2011

Z
Потому, что все ресурсы должны лежать в едином memory-mapped файле.

#12
2:05, 22 дек 2011

Nomad
Ето зачем ето должнъ? Как на етапе разработки собрать сотни файлов в memory mapped?

#13
9:23, 22 дек 2011

Nomad
В чем профит хранить все ресурсы в едином файле?

#14
9:48, 22 дек 2011

nes
> Есть возможность загружать ресурсы из файла и из архива, как это можно красиво
> реализовать?

Что значит "красиво"? Зачем нужна "красивая" реализация?

EDIT: каковы требования? почему не устраивает то, что есть сейчас?

Страницы: 1 2 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.