Gamelist loading speedup: Be lazy about parsing the file system - it's not necessary for Wii games since the banners are external (in savegames). Also make it possible for the gamelist code to create cache entries for GC images without banners.

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5595 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
hrydgard 2010-06-03 20:37:32 +00:00
parent 49bbbe099d
commit 5539dd4e8b
7 changed files with 55 additions and 41 deletions

View File

@ -183,7 +183,6 @@ public:
template<class T> template<class T>
static bool Load(const std::string& _rFilename, int _Revision, T& _class) static bool Load(const std::string& _rFilename, int _Revision, T& _class)
{ {
INFO_LOG(COMMON, "ChunkReader: Loading %s" , _rFilename.c_str()); INFO_LOG(COMMON, "ChunkReader: Loading %s" , _rFilename.c_str());
if (! File::Exists(_rFilename.c_str())) if (! File::Exists(_rFilename.c_str()))

View File

@ -128,15 +128,18 @@ bool IBannerLoader::CopyBeUnicodeToString( std::string& _rDestination, const u16
return returnCode; return returnCode;
} }
IBannerLoader* CreateBannerLoader(DiscIO::IFileSystem& _rFileSystem, DiscIO::IVolume *pVolume) IBannerLoader* CreateBannerLoader(DiscIO::IFileSystem& _rFileSystem, DiscIO::IVolume *pVolume)
{ {
if (IsVolumeWiiDisc(pVolume) || IsVolumeWadFile(pVolume)) if (IsVolumeWiiDisc(pVolume) || IsVolumeWadFile(pVolume))
{ {
return(new CBannerLoaderWii(pVolume)); return new CBannerLoaderWii(pVolume);
}
if (_rFileSystem.IsValid())
{
return new CBannerLoaderGC(_rFileSystem);
} }
return(new CBannerLoaderGC(_rFileSystem)); return NULL;
} }
} // namespace
} // namespace

View File

@ -29,26 +29,21 @@ namespace DiscIO
CFileSystemGCWii::CFileSystemGCWii(const IVolume *_rVolume) CFileSystemGCWii::CFileSystemGCWii(const IVolume *_rVolume)
: IFileSystem(_rVolume), : IFileSystem(_rVolume),
m_Initialized(false), m_Initialized(false),
m_Valid(false),
m_OffsetShift(0) m_OffsetShift(0)
{ {
m_Initialized = InitFileSystem(); m_Valid = DetectFileSystem();
} }
CFileSystemGCWii::~CFileSystemGCWii() CFileSystemGCWii::~CFileSystemGCWii()
{ {
m_FileInfoVector.clear(); m_FileInfoVector.clear();
} }
bool CFileSystemGCWii::IsInitialized() const u64 CFileSystemGCWii::GetFileSize(const char* _rFullPath)
{
return m_Initialized;
}
u64 CFileSystemGCWii::GetFileSize(const char* _rFullPath) const
{ {
if (!m_Initialized) if (!m_Initialized)
return 0; InitFileSystem();
const SFileInfo* pFileInfo = FindFileInfo(_rFullPath); const SFileInfo* pFileInfo = FindFileInfo(_rFullPath);
@ -58,8 +53,11 @@ u64 CFileSystemGCWii::GetFileSize(const char* _rFullPath) const
return 0; return 0;
} }
const char* CFileSystemGCWii::GetFileName(u64 _Address) const const char* CFileSystemGCWii::GetFileName(u64 _Address)
{ {
if (!m_Initialized)
InitFileSystem();
for (size_t i = 0; i < m_FileInfoVector.size(); i++) for (size_t i = 0; i < m_FileInfoVector.size(); i++)
{ {
if ((m_FileInfoVector[i].m_Offset <= _Address) && if ((m_FileInfoVector[i].m_Offset <= _Address) &&
@ -72,10 +70,10 @@ const char* CFileSystemGCWii::GetFileName(u64 _Address) const
return 0; return 0;
} }
u64 CFileSystemGCWii::ReadFile(const char* _rFullPath, u8* _pBuffer, size_t _MaxBufferSize) const u64 CFileSystemGCWii::ReadFile(const char* _rFullPath, u8* _pBuffer, size_t _MaxBufferSize)
{ {
if (!m_Initialized) if (!m_Initialized)
return 0; InitFileSystem();
const SFileInfo* pFileInfo = FindFileInfo(_rFullPath); const SFileInfo* pFileInfo = FindFileInfo(_rFullPath);
if (pFileInfo == NULL) if (pFileInfo == NULL)
@ -90,8 +88,11 @@ u64 CFileSystemGCWii::ReadFile(const char* _rFullPath, u8* _pBuffer, size_t _Max
return pFileInfo->m_FileSize; return pFileInfo->m_FileSize;
} }
bool CFileSystemGCWii::ExportFile(const char* _rFullPath, const char* _rExportFilename) const bool CFileSystemGCWii::ExportFile(const char* _rFullPath, const char* _rExportFilename)
{ {
if (!m_Initialized)
InitFileSystem();
const SFileInfo* pFileInfo = FindFileInfo(_rFullPath); const SFileInfo* pFileInfo = FindFileInfo(_rFullPath);
if (!pFileInfo || pFileInfo->m_FileSize == 0) if (!pFileInfo || pFileInfo->m_FileSize == 0)
@ -214,8 +215,11 @@ void CFileSystemGCWii::GetStringFromOffset(u64 _Offset, char* Filename) const
m_rVolume->Read(_Offset, 255, (u8*)Filename); m_rVolume->Read(_Offset, 255, (u8*)Filename);
} }
size_t CFileSystemGCWii::GetFileList(std::vector<const SFileInfo *> &_rFilenames) const size_t CFileSystemGCWii::GetFileList(std::vector<const SFileInfo *> &_rFilenames)
{ {
if (!m_Initialized)
InitFileSystem();
if (_rFilenames.size()) if (_rFilenames.size())
PanicAlert("GetFileList : input list has contents?"); PanicAlert("GetFileList : input list has contents?");
_rFilenames.clear(); _rFilenames.clear();
@ -225,8 +229,11 @@ size_t CFileSystemGCWii::GetFileList(std::vector<const SFileInfo *> &_rFilenames
return m_FileInfoVector.size(); return m_FileInfoVector.size();
} }
const SFileInfo* CFileSystemGCWii::FindFileInfo(const char* _rFullPath) const const SFileInfo* CFileSystemGCWii::FindFileInfo(const char* _rFullPath)
{ {
if (!m_Initialized)
InitFileSystem();
for (size_t i = 0; i < m_FileInfoVector.size(); i++) for (size_t i = 0; i < m_FileInfoVector.size(); i++)
{ {
if (!strcasecmp(m_FileInfoVector[i].m_FullPath, _rFullPath)) if (!strcasecmp(m_FileInfoVector[i].m_FullPath, _rFullPath))
@ -236,7 +243,7 @@ const SFileInfo* CFileSystemGCWii::FindFileInfo(const char* _rFullPath) const
return NULL; return NULL;
} }
bool CFileSystemGCWii::InitFileSystem() bool CFileSystemGCWii::DetectFileSystem()
{ {
if (Read32(0x18) == 0x5D1C9EA3) if (Read32(0x18) == 0x5D1C9EA3)
{ {
@ -250,6 +257,11 @@ bool CFileSystemGCWii::InitFileSystem()
{ {
return false; return false;
} }
}
void CFileSystemGCWii::InitFileSystem()
{
m_Initialized = true;
// read the whole FST // read the whole FST
u64 FSTOffset = (u64)Read32(0x424) << m_OffsetShift; u64 FSTOffset = (u64)Read32(0x424) << m_OffsetShift;
@ -284,8 +296,6 @@ bool CFileSystemGCWii::InitFileSystem()
BuildFilenames(1, m_FileInfoVector.size(), NULL, NameTableOffset); BuildFilenames(1, m_FileInfoVector.size(), NULL, NameTableOffset);
} }
return true;
} }
// Changed this stuff from C++ string to C strings for speed in debug mode. Doesn't matter in release, but // Changed this stuff from C++ string to C strings for speed in debug mode. Doesn't matter in release, but

View File

@ -30,24 +30,27 @@ class CFileSystemGCWii : public IFileSystem
public: public:
CFileSystemGCWii(const IVolume *_rVolume); CFileSystemGCWii(const IVolume *_rVolume);
virtual ~CFileSystemGCWii(); virtual ~CFileSystemGCWii();
virtual bool IsInitialized() const; virtual bool IsValid() const { return m_Valid; }
virtual u64 GetFileSize(const char* _rFullPath) const; virtual u64 GetFileSize(const char* _rFullPath);
virtual size_t GetFileList(std::vector<const SFileInfo *> &_rFilenames) const; virtual size_t GetFileList(std::vector<const SFileInfo *> &_rFilenames);
virtual const char* GetFileName(u64 _Address) const; virtual const char* GetFileName(u64 _Address);
virtual u64 ReadFile(const char* _rFullPath, u8* _pBuffer, size_t _MaxBufferSize) const; virtual u64 ReadFile(const char* _rFullPath, u8* _pBuffer, size_t _MaxBufferSize);
virtual bool ExportFile(const char* _rFullPath, const char* _rExportFilename) const; virtual bool ExportFile(const char* _rFullPath, const char* _rExportFilename);
virtual bool ExportApploader(const char* _rExportFolder) const; virtual bool ExportApploader(const char* _rExportFolder) const;
virtual bool ExportDOL(const char* _rExportFolder) const; virtual bool ExportDOL(const char* _rExportFolder) const;
private: private:
bool m_Valid;
bool m_Initialized; bool m_Initialized;
u32 m_OffsetShift; // WII offsets are all shifted u32 m_OffsetShift; // WII offsets are all shifted
std::vector <SFileInfo> m_FileInfoVector; std::vector <SFileInfo> m_FileInfoVector;
u32 Read32(u64 _Offset) const; u32 Read32(u64 _Offset) const;
void GetStringFromOffset(u64 _Offset, char* Filename) const; void GetStringFromOffset(u64 _Offset, char* Filename) const;
const SFileInfo* FindFileInfo(const char* _rFullPath) const; const SFileInfo* FindFileInfo(const char* _rFullPath);
bool InitFileSystem(); bool DetectFileSystem();
void InitFileSystem();
size_t BuildFilenames(const size_t _FirstIndex, const size_t _LastIndex, const char* _szDirectory, u64 _NameTableOffset); size_t BuildFilenames(const size_t _FirstIndex, const size_t _LastIndex, const char* _szDirectory, u64 _NameTableOffset);
}; };

View File

@ -40,7 +40,7 @@ IFileSystem* CreateFileSystem(const IVolume* _rVolume)
if (!pFileSystem) if (!pFileSystem)
return 0; return 0;
if (!pFileSystem->IsInitialized()) if (!pFileSystem->IsValid())
{ {
delete pFileSystem; delete pFileSystem;
pFileSystem = NULL; pFileSystem = NULL;

View File

@ -49,14 +49,14 @@ public:
IFileSystem(const IVolume *_rVolume); IFileSystem(const IVolume *_rVolume);
virtual ~IFileSystem(); virtual ~IFileSystem();
virtual bool IsInitialized() const = 0; virtual bool IsValid() const = 0;
virtual size_t GetFileList(std::vector<const SFileInfo *> &_rFilenames) const = 0; virtual size_t GetFileList(std::vector<const SFileInfo *> &_rFilenames) = 0;
virtual u64 GetFileSize(const char* _rFullPath) const = 0; virtual u64 GetFileSize(const char* _rFullPath) = 0;
virtual u64 ReadFile(const char* _rFullPath, u8* _pBuffer, size_t _MaxBufferSize) const = 0; virtual u64 ReadFile(const char* _rFullPath, u8* _pBuffer, size_t _MaxBufferSize) = 0;
virtual bool ExportFile(const char* _rFullPath, const char* _rExportFilename) const = 0; virtual bool ExportFile(const char* _rFullPath, const char* _rExportFilename) = 0;
virtual bool ExportApploader(const char* _rExportFolder) const = 0; virtual bool ExportApploader(const char* _rExportFolder) const = 0;
virtual bool ExportDOL(const char* _rExportFolder) const = 0; virtual bool ExportDOL(const char* _rExportFolder) const = 0;
virtual const char* GetFileName(u64 _Address) const = 0; virtual const char* GetFileName(u64 _Address) = 0;
virtual const IVolume *GetVolume() const { return m_rVolume; } virtual const IVolume *GetVolume() const { return m_rVolume; }
protected: protected:

View File

@ -46,7 +46,6 @@ GameListItem::GameListItem(const std::string& _rFileName)
, m_pImage(NULL) , m_pImage(NULL)
, m_ImageSize(0) , m_ImageSize(0)
{ {
if (LoadFromCache()) if (LoadFromCache())
{ {
m_Valid = true; m_Valid = true;
@ -119,9 +118,9 @@ GameListItem::GameListItem(const std::string& _rFileName)
m_Valid = true; m_Valid = true;
// just if we have an image create a cache file // If not Gamecube, create a cache file only if we have an image.
// Wii isos create their images after you have generated the first savegame // Wii isos create their images after you have generated the first savegame
if (m_pImage) if (m_Platform == GAMECUBE_DISC || m_pImage)
SaveToCache(); SaveToCache();
} }
} }