From 2b6670c2df3bd420589412464c98f037ac9a59a6 Mon Sep 17 00:00:00 2001 From: Thai Pangsakulyanont Date: Mon, 21 May 2012 14:27:17 +0700 Subject: [PATCH] optimize adding background changes I have a song with 5841 background changes and it took 3 seconds to load that song. --- src/BackgroundUtil.cpp | 7 +++++++ src/BackgroundUtil.h | 1 + src/Song.cpp | 6 ++---- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/BackgroundUtil.cpp b/src/BackgroundUtil.cpp index be20d456bb..4d608a6e18 100644 --- a/src/BackgroundUtil.cpp +++ b/src/BackgroundUtil.cpp @@ -129,6 +129,13 @@ void BackgroundUtil::SortBackgroundChangesArray( vector &vBack sort( vBackgroundChanges.begin(), vBackgroundChanges.end(), CompareBackgroundChanges ); } +void BackgroundUtil::AddBackgroundChange( vector &vBackgroundChanges, BackgroundChange seg ) +{ + vector::iterator it; + it = upper_bound( vBackgroundChanges.begin(), vBackgroundChanges.end(), seg, CompareBackgroundChanges ); + vBackgroundChanges.insert( it, seg ); +} + void BackgroundUtil::GetBackgroundEffects( const RString &_sName, vector &vsPathsOut, vector &vsNamesOut ) { RString sName = _sName; diff --git a/src/BackgroundUtil.h b/src/BackgroundUtil.h index c4907b590c..4858019e5f 100644 --- a/src/BackgroundUtil.h +++ b/src/BackgroundUtil.h @@ -73,6 +73,7 @@ struct BackgroundChange /** @brief Shared background-related routines. */ namespace BackgroundUtil { + void AddBackgroundChange( vector &vBackgroundChanges, BackgroundChange seg ); void SortBackgroundChangesArray( vector &vBackgroundChanges ); void GetBackgroundEffects( const RString &sName, vector &vsPathsOut, vector &vsNamesOut ); diff --git a/src/Song.cpp b/src/Song.cpp index 33299ff66a..719509a18a 100644 --- a/src/Song.cpp +++ b/src/Song.cpp @@ -175,14 +175,12 @@ void Song::AddBackgroundChange( BackgroundLayer iLayer, BackgroundChange seg ) } ASSERT( iLayer >= 0 && iLayer < NUM_BackgroundLayer ); - GetBackgroundChanges(iLayer).push_back( seg ); - BackgroundUtil::SortBackgroundChangesArray( GetBackgroundChanges(iLayer) ); + BackgroundUtil::AddBackgroundChange( GetBackgroundChanges(iLayer), seg ); } void Song::AddForegroundChange( BackgroundChange seg ) { - GetForegroundChanges().push_back( seg ); - BackgroundUtil::SortBackgroundChangesArray( GetForegroundChanges() ); + BackgroundUtil::AddBackgroundChange( GetForegroundChanges(), seg ); } void Song::AddLyricSegment( LyricSegment seg )