optmization: move iterators used by UpdateJudgedRows into Player
This commit is contained in:
+58
-25
@@ -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 )
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user