optmization: move iterators used by UpdateJudgedRows into Player

This commit is contained in:
Chris Danford
2007-09-12 11:00:14 +00:00
parent 493614d57e
commit 0873cbae8b
2 changed files with 124 additions and 93 deletions
+58 -25
View File
@@ -160,6 +160,8 @@ Player::Player( NoteData &nd, bool bVisible ) : m_NoteData(nd)
m_pIterNotJudged = NULL; m_pIterNotJudged = NULL;
m_pIterCurrentOrUpcoming = NULL; m_pIterCurrentOrUpcoming = NULL;
m_pIterUncrossedRows = NULL; m_pIterUncrossedRows = NULL;
m_pIterUnjudgedRows = NULL;
m_pIterUnjudgedMineRows = NULL;
m_bPaused = false; m_bPaused = false;
@@ -193,6 +195,8 @@ Player::~Player()
SAFE_DELETE( m_pIterNotJudged ); SAFE_DELETE( m_pIterNotJudged );
SAFE_DELETE( m_pIterCurrentOrUpcoming ); SAFE_DELETE( m_pIterCurrentOrUpcoming );
SAFE_DELETE( m_pIterUncrossedRows ); SAFE_DELETE( m_pIterUncrossedRows );
SAFE_DELETE( m_pIterUnjudgedRows );
SAFE_DELETE( m_pIterUnjudgedMineRows );
} }
/* Init() does the expensive stuff: load sounds and note skins. Load() just loads a NoteData. */ /* Init() does the expensive stuff: load sounds and note skins. Load() just loads a NoteData. */
@@ -402,9 +406,6 @@ void Player::Load()
// The editor can start playing in the middle of the song. // The editor can start playing in the middle of the song.
const int iNoteRow = BeatToNoteRowNotRounded( GAMESTATE->m_fSongBeat ); const int iNoteRow = BeatToNoteRowNotRounded( GAMESTATE->m_fSongBeat );
m_iFirstUncrossedRow = iNoteRow - 1; m_iFirstUncrossedRow = iNoteRow - 1;
m_iFirstUncrossedMineRow = iNoteRow - 1;
m_iRowLastJudged = iNoteRow - 1;
m_iMineRowLastJudged = iNoteRow - 1;
m_pJudgedRows->Reset( iNoteRow ); m_pJudgedRows->Reset( iNoteRow );
// TODO: Remove use of PlayerNumber. // TODO: Remove use of PlayerNumber.
@@ -521,10 +522,16 @@ void Player::Load()
m_pIterNotJudged = new NoteData::all_tracks_iterator( m_NoteData.GetTapNoteRangeAllTracks(iNoteRow, MAX_NOTE_ROW, NotJudged) ); m_pIterNotJudged = new NoteData::all_tracks_iterator( m_NoteData.GetTapNoteRangeAllTracks(iNoteRow, MAX_NOTE_ROW, NotJudged) );
SAFE_DELETE( m_pIterCurrentOrUpcoming ); SAFE_DELETE( m_pIterCurrentOrUpcoming );
m_pIterCurrentOrUpcoming = new NoteData::all_tracks_iterator( m_NoteData.GetTapNoteRangeAllTracks(iNoteRow, MAX_NOTE_ROW, NotJudged) ); m_pIterCurrentOrUpcoming = new NoteData::all_tracks_iterator( m_NoteData.GetTapNoteRangeAllTracks(iNoteRow, MAX_NOTE_ROW ) );
SAFE_DELETE( m_pIterUncrossedRows ); SAFE_DELETE( m_pIterUncrossedRows );
m_pIterUncrossedRows = new NoteData::all_tracks_iterator( m_NoteData.GetTapNoteRangeAllTracks(iNoteRow, MAX_NOTE_ROW, NotJudged) ); m_pIterUncrossedRows = new NoteData::all_tracks_iterator( m_NoteData.GetTapNoteRangeAllTracks(iNoteRow, MAX_NOTE_ROW ) );
SAFE_DELETE( m_pIterUnjudgedRows );
m_pIterUnjudgedRows = new NoteData::all_tracks_iterator( m_NoteData.GetTapNoteRangeAllTracks(iNoteRow, MAX_NOTE_ROW ) );
SAFE_DELETE( m_pIterUnjudgedMineRows );
m_pIterUnjudgedMineRows = new NoteData::all_tracks_iterator( m_NoteData.GetTapNoteRangeAllTracks(iNoteRow, MAX_NOTE_ROW ) );
} }
void Player::SendComboMessages( int iOldCombo, int iOldMissCombo ) void Player::SendComboMessages( int iOldCombo, int iOldMissCombo )
@@ -792,12 +799,10 @@ void Player::Update( float fDeltaTime )
if( iRowNow >= 0 ) if( iRowNow >= 0 )
{ {
if( GAMESTATE->IsPlayerEnabled(m_pPlayerState) ) if( GAMESTATE->IsPlayerEnabled(m_pPlayerState) )
CrossedRows( m_iFirstUncrossedRow, iRowNow, now ); CrossedRows( iRowNow, now );
m_iFirstUncrossedRow = iRowNow+1;
} }
} }
{ {
// TRICKY: // TRICKY:
float fPositionSeconds = GAMESTATE->m_fMusicSeconds; float fPositionSeconds = GAMESTATE->m_fMusicSeconds;
@@ -2193,15 +2198,20 @@ void Player::UpdateJudgedRows()
bool bAllJudged = true; bool bAllJudged = true;
const bool bSeparately = GAMESTATE->GetCurrentGame()->m_bCountNotesSeparately; const bool bSeparately = GAMESTATE->GetCurrentGame()->m_bCountNotesSeparately;
for( int iRow = m_iRowLastJudged+1; iRow <= iEndRow; ++iRow ) NoteData::all_tracks_iterator &iter = *m_pIterUnjudgedRows;
int iLastSeenRow = -1;
for( ; !iter.IsAtEnd() && iter.Row() <= iEndRow; iter++ )
{ {
int iRow = iter.Row();
if( iLastSeenRow != iRow )
{
// crossed a not-empty row
if( !NoteDataWithScoring::IsRowCompletelyJudged(m_NoteData, iRow, pn) ) if( !NoteDataWithScoring::IsRowCompletelyJudged(m_NoteData, iRow, pn) )
{ {
bAllJudged = false; bAllJudged = false;
continue; continue;
} }
if( bAllJudged )
++m_iRowLastJudged;
if( m_pJudgedRows->JudgeRow(iRow) ) if( m_pJudgedRows->JudgeRow(iRow) )
continue; continue;
const TapNoteResult &lastTNR = NoteDataWithScoring::LastTapNoteWithResult( m_NoteData, iRow, pn ).result; const TapNoteResult &lastTNR = NoteDataWithScoring::LastTapNoteWithResult( m_NoteData, iRow, pn ).result;
@@ -2224,21 +2234,42 @@ void Player::UpdateJudgedRows()
} }
HandleTapRowScore( iRow ); HandleTapRowScore( iRow );
} }
}
NoteData::all_tracks_iterator iter = m_NoteData.GetTapNoteRangeAllTracks( m_iMineRowLastJudged+1, iEndRow+1, MinesNotHidden );
{
bAllJudged = true; bAllJudged = true;
set<RageSound *> setSounds; set<RageSound *> setSounds;
for( ; !iter.IsAtEnd(); ++iter ) NoteData::all_tracks_iterator iter = *m_pIterUnjudgedMineRows; // copy
int iLastSeenRow = -1;
for( ; !iter.IsAtEnd() && iter.Row() <= iEndRow; iter++ )
{ {
int iRow = iter.Row();
TapNote &tn = *iter; TapNote &tn = *iter;
if( iRow != iLastSeenRow )
{
if( bAllJudged )
{
SAFE_DELETE( m_pIterUnjudgedMineRows );
m_pIterUnjudgedMineRows = new NoteData::all_tracks_iterator(iter);
}
}
bool bMineNotHidden = tn.type == TapNote::mine && !tn.result.bHidden;
if( !bMineNotHidden )
continue;
switch( tn.result.tns ) switch( tn.result.tns )
{ {
case TNS_None: bAllJudged = false;
case TNS_AvoidMine: continue;
case TNS_HitMine: break;
DEFAULT_FAIL( tn.result.tns ); DEFAULT_FAIL( tn.result.tns );
case TNS_None:
bAllJudged = false;
continue;
case TNS_AvoidMine:
continue;
case TNS_HitMine:
break;
} }
if( m_pNoteField ) if( m_pNoteField )
m_pNoteField->DidTapNote( iter.Track(), tn.result.tns, false ); m_pNoteField->DidTapNote( iter.Track(), tn.result.tns, false );
@@ -2262,9 +2293,6 @@ void Player::UpdateJudgedRows()
if( m_pSecondaryScoreKeeper ) if( m_pSecondaryScoreKeeper )
m_pSecondaryScoreKeeper->HandleTapScore( tn ); m_pSecondaryScoreKeeper->HandleTapScore( tn );
tn.result.bHidden = true; tn.result.bHidden = true;
// Subtract one to ensure that we have actually completed the row.
if( bAllJudged && iter.Row() - 1 > m_iMineRowLastJudged )
m_iMineRowLastJudged = iter.Row() - 1;
} }
FOREACHS( RageSound *, setSounds, s ) FOREACHS( RageSound *, setSounds, s )
@@ -2273,9 +2301,7 @@ void Player::UpdateJudgedRows()
(*s)->Stop(); (*s)->Stop();
(*s)->Play(); (*s)->Play();
} }
}
if( bAllJudged )
m_iMineRowLastJudged = iEndRow;
} }
void Player::FlashGhostRow( int iRow, PlayerNumber pn ) void Player::FlashGhostRow( int iRow, PlayerNumber pn )
@@ -2300,7 +2326,7 @@ void Player::FlashGhostRow( int iRow, PlayerNumber pn )
} }
} }
void Player::CrossedRows( int iFirstRowCrossed, int iLastRowCrossed, const RageTimer &now ) void Player::CrossedRows( int iLastRowCrossed, const RageTimer &now )
{ {
//LOG->Trace( "Player::CrossedRows %d %d", iFirstRowCrossed, iLastRowCrossed ); //LOG->Trace( "Player::CrossedRows %d %d", iFirstRowCrossed, iLastRowCrossed );
@@ -2312,8 +2338,13 @@ void Player::CrossedRows( int iFirstRowCrossed, int iLastRowCrossed, const RageT
TapNote &tn = *iter; TapNote &tn = *iter;
int iRow = iter.Row(); int iRow = iter.Row();
int iTrack = iter.Track(); int iTrack = iter.Track();
if( tn.type == TapNote::hold_head ) switch( tn.type )
{
case TapNote::hold_head:
tn.HoldResult.fLife = INITIAL_HOLD_LIFE; tn.HoldResult.fLife = INITIAL_HOLD_LIFE;
break;
}
if( iRow != iLastSeenRow ) if( iRow != iLastSeenRow )
{ {
@@ -2349,7 +2380,7 @@ void Player::CrossedRows( int iFirstRowCrossed, int iLastRowCrossed, const RageT
const int CHECKPOINT_FREQUENCY_ROWS = ROWS_PER_BEAT/2; const int CHECKPOINT_FREQUENCY_ROWS = ROWS_PER_BEAT/2;
// "the first row after the start of the range that lands on a beat" // "the first row after the start of the range that lands on a beat"
int iFirstCheckpointInRange = ((iFirstRowCrossed+CHECKPOINT_FREQUENCY_ROWS-1)/CHECKPOINT_FREQUENCY_ROWS) * CHECKPOINT_FREQUENCY_ROWS; int iFirstCheckpointInRange = ((m_iFirstUncrossedRow+CHECKPOINT_FREQUENCY_ROWS-1)/CHECKPOINT_FREQUENCY_ROWS) * CHECKPOINT_FREQUENCY_ROWS;
// "the last row or first row earlier that lands on a beat" // "the last row or first row earlier that lands on a beat"
int iLastCheckpointInRange = ((iLastRowCrossed)/CHECKPOINT_FREQUENCY_ROWS) * CHECKPOINT_FREQUENCY_ROWS; int iLastCheckpointInRange = ((iLastRowCrossed)/CHECKPOINT_FREQUENCY_ROWS) * CHECKPOINT_FREQUENCY_ROWS;
@@ -2405,6 +2436,8 @@ void Player::CrossedRows( int iFirstRowCrossed, int iLastRowCrossed, const RageT
} }
} }
} }
m_iFirstUncrossedRow = iLastRowCrossed+1;
} }
void Player::CrossedMineRow( int iNoteRow, const RageTimer &now ) void Player::CrossedMineRow( int iNoteRow, const RageTimer &now )
+4 -6
View File
@@ -65,8 +65,7 @@ public:
ScoreKeeper* pPrimaryScoreKeeper, ScoreKeeper* pPrimaryScoreKeeper,
ScoreKeeper* pSecondaryScoreKeeper ); ScoreKeeper* pSecondaryScoreKeeper );
void Load(); void Load();
void CrossedRows( int iFirstRowCrossed, int iLastRowCrossed, const RageTimer &now ); void CrossedRows( int iLastRowCrossed, const RageTimer &now );
void CrossedMineRow( int iNoteRow, const RageTimer &now );
bool IsOniDead() const; bool IsOniDead() const;
// Called when a fret, step, or strum type button changes // Called when a fret, step, or strum type button changes
@@ -167,13 +166,12 @@ protected:
ScoreKeeper *m_pSecondaryScoreKeeper; ScoreKeeper *m_pSecondaryScoreKeeper;
Inventory *m_pInventory; Inventory *m_pInventory;
int m_iFirstUncrossedRow; int m_iFirstUncrossedRow; // used by hold checkpoints logic
int m_iFirstUncrossedMineRow;
NoteData::all_tracks_iterator *m_pIterNotJudged; NoteData::all_tracks_iterator *m_pIterNotJudged;
NoteData::all_tracks_iterator *m_pIterCurrentOrUpcoming; NoteData::all_tracks_iterator *m_pIterCurrentOrUpcoming;
NoteData::all_tracks_iterator *m_pIterUncrossedRows; NoteData::all_tracks_iterator *m_pIterUncrossedRows;
int m_iRowLastJudged; // Everything up to and including this row has been judged. NoteData::all_tracks_iterator *m_pIterUnjudgedRows;
int m_iMineRowLastJudged; NoteData::all_tracks_iterator *m_pIterUnjudgedMineRows;
int m_iLastSeenCombo; int m_iLastSeenCombo;
JudgedRows *m_pJudgedRows; JudgedRows *m_pJudgedRows;