skip recalculating radar values and last beat when loading from cache. loading songs from the cache is now 5x faster.

fyi: it took 1:40 minutes to load my library, now it's only 20 seconds.
This commit is contained in:
Thai Pangsakulyanont
2011-06-04 17:28:20 +07:00
parent 6ca0cd1e70
commit a1681faa06
5 changed files with 25 additions and 10 deletions
+1 -1
View File
@@ -964,7 +964,7 @@ void SMLoader::TidyUpData( Song &song, bool bFromCache )
bg.push_back( BackgroundChange(song.m_fLastBeat,song.m_sBackgroundFile) );
} while(0);
}
song.TidyUpData();
song.TidyUpData( bFromCache );
}
/*
+12 -6
View File
@@ -236,9 +236,7 @@ bool Song::LoadFromSongDir( RString sDir )
{
// LOG->Trace( "Loading '%s' from cache file '%s'.", m_sSongDir.c_str(), GetCacheFilePath().c_str() );
bool bLoadedFromSSC = SSCLoader::LoadFromSSCFile( sCacheFilePath, *this, true );
if( bLoadedFromSSC )
SSCLoader::TidyUpData( *this, true );
else
if( !bLoadedFromSSC )
{
// load from .sm
SMLoader::LoadFromSMFile( sCacheFilePath, *this, true );
@@ -390,7 +388,7 @@ void FixupPath( RString &path, const RString &sSongPath )
}
// Songs in BlacklistImages will never be autodetected as song images.
void Song::TidyUpData()
void Song::TidyUpData( bool bFromCache )
{
// We need to do this before calling any of HasMusic, HasHasCDTitle, etc.
ASSERT_M( m_sSongDir.Left(3) != "../", m_sSongDir ); // meaningless
@@ -481,7 +479,7 @@ void Song::TidyUpData()
/* Generate these before we autogen notes, so the new notes can inherit
* their source's values. */
ReCalculateRadarValuesAndLastBeat();
ReCalculateRadarValuesAndLastBeat( bFromCache );
Trim( m_sMainTitle );
Trim( m_sSubTitle );
@@ -791,8 +789,16 @@ void Song::TranslateTitles()
title.SaveToStrings( m_sMainTitle, m_sSubTitle, m_sArtist, m_sMainTitleTranslit, m_sSubTitleTranslit, m_sArtistTranslit );
}
void Song::ReCalculateRadarValuesAndLastBeat()
void Song::ReCalculateRadarValuesAndLastBeat( bool bFromCache )
{
if( bFromCache && m_fFirstBeat >= 0 && m_fLastBeat > 0 )
{
// this is loaded from cache, then we just have to calculate the radar values.
for( unsigned i=0; i<m_vpSteps.size(); i++ )
m_vpSteps[i]->CalculateRadarValues( m_fMusicLengthSeconds );
return;
}
float fFirstBeat = FLT_MAX; // inf
float fLastBeat = m_fSpecifiedLastBeat; // Make sure we're at least as long as the specified amount.
+2 -2
View File
@@ -97,13 +97,13 @@ public:
bool ReloadFromSongDir( RString sDir );
/** @brief Call this after loading a song to clean up invalid data. */
void TidyUpData();
void TidyUpData( bool bFromCache = false );
/**
* @brief Get the new radar values, and determine the last beat at the same time.
*
* This is called by TidyUpData, after saving the Song. */
void ReCalculateRadarValuesAndLastBeat();
void ReCalculateRadarValuesAndLastBeat( bool bFromCache = false );
/**
* @brief Translate any titles that aren't in english.
*
+9 -1
View File
@@ -31,7 +31,8 @@ Steps::Steps(): m_StepsType(StepsType_Invalid),
m_sNoteDataCompressed(""), m_sFilename(""), m_bSavedToDisk(false),
m_LoadedFromProfile(ProfileSlot_Invalid), m_iHash(0),
m_sDescription(""), m_sChartStyle(""),
m_Difficulty(Difficulty_Invalid), m_iMeter(0), m_sCredit("") {}
m_Difficulty(Difficulty_Invalid), m_iMeter(0), m_sCredit(""),
m_bAreCachedRadarValuesJustLoaded(false) {}
Steps::~Steps()
{
@@ -171,6 +172,12 @@ void Steps::CalculateRadarValues( float fMusicLengthSeconds )
if( parent != NULL )
return;
if( m_bAreCachedRadarValuesJustLoaded )
{
m_bAreCachedRadarValuesJustLoaded = false;
return;
}
// Do write radar values, and leave it up to the reading app whether they want to trust
// the cached values without recalculating them.
/*
@@ -422,6 +429,7 @@ void Steps::SetCachedRadarValues( const RadarValues v[NUM_PLAYERS] )
{
DeAutogen();
copy( v, v + NUM_PLAYERS, m_CachedRadarValues );
m_bAreCachedRadarValuesJustLoaded = true;
}
bool Steps::UsesSplitTiming() const
+1
View File
@@ -180,6 +180,7 @@ private:
int m_iMeter;
/** @brief The radar values used for each player. */
RadarValues m_CachedRadarValues[NUM_PLAYERS];
bool m_bAreCachedRadarValuesJustLoaded;
/** @brief The name of the person who created the Steps. */
RString m_sCredit;
};