Skip to content

Commit 7efa383

Browse files
committed
Change back to the original binary search function for finding pixels, but retain other changes. Results in nearly the same performance.
1 parent 5ec9ed6 commit 7efa383

File tree

1 file changed

+34
-59
lines changed

1 file changed

+34
-59
lines changed

src/NoteField.cpp

Lines changed: 34 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -627,84 +627,59 @@ void FindDisplayedBeats(const PlayerState* pPlayerState, float &firstBeat, float
627627
{
628628
float fFirstBeatToDraw = pPlayerState->GetDisplayedPosition().m_fSongBeatVisible;
629629
float fLastBeatToDraw = fFirstBeatToDraw;
630+
float fSpeedMultiplier = pPlayerState->GetDisplayedTiming().GetDisplayedSpeedPercent(pPlayerState->GetDisplayedPosition().m_fSongBeatVisible, pPlayerState->GetDisplayedPosition().m_fMusicSecondsVisible);
630631

631632
bool bBoomerang;
632633
{
633634
const float* fAccels = pPlayerState->m_PlayerOptions.GetCurrent().m_fAccels;
634635
bBoomerang = (fAccels[PlayerOptions::ACCEL_BOOMERANG] != 0);
635636
}
636-
637637

638-
// TODO: Account for M Mods...
639-
static float lastKnownBPS = 0;
640-
static float lastKnownRate = 0;
641-
static float lastKnownXSpeed = 0;
642-
static float lastKnownCSpeed = 0;
643-
static float pixelsPerBeat = 0;
644-
645-
float currentBPS = pPlayerState->GetDisplayedPosition().m_fCurBPS;
646-
float currentRate = GAMESTATE->m_SongOptions.GetCurrent().m_fMusicRate;
647-
float currentXSpace = pPlayerState->m_PlayerOptions.GetCurrent().m_fScrollSpeed;
648-
float currentCSpace = pPlayerState->m_PlayerOptions.GetCurrent().m_fScrollBPM;
649-
650-
// If anything changed which modifys the distance between arrows, update the pixels per beat.
651-
if (lastKnownBPS != currentBPS || lastKnownRate != currentRate
652-
|| lastKnownCSpeed != currentCSpace || lastKnownXSpeed != currentXSpace)
638+
// Search for the draw distance pixels
639+
float fSearchDistance = 10;
640+
const int NUM_ITERATIONS = 20;
641+
642+
for (int i = 0; i<NUM_ITERATIONS; i++)
653643
{
654644
bool bIsPastPeakYOffset;
655645
float fPeakYOffset;
646+
float fYOffset = ArrowEffects::GetYOffset(pPlayerState, 0, fLastBeatToDraw, fPeakYOffset, bIsPastPeakYOffset, true);
656647

657-
lastKnownBPS = currentBPS;
658-
lastKnownRate = currentRate;
659-
lastKnownXSpeed = currentXSpace;
660-
lastKnownCSpeed = currentCSpace;
661-
662-
float lastBeatElapsedTime = pPlayerState->GetDisplayedTiming().ElapsedTimesAtAllRows.at(pPlayerState->GetDisplayedTiming().ElapsedTimesAtAllRows.size() - 1);
663-
664-
TimingData::GetBeatArgs lastBeatArgs;
665-
lastBeatArgs.elapsed_time = lastBeatElapsedTime;
666-
pPlayerState->GetDisplayedTiming().GetBeatAndBPSFromElapsedTime(lastBeatArgs);
648+
if (bBoomerang && !bIsPastPeakYOffset)
649+
fLastBeatToDraw += fSearchDistance;
650+
else if (fYOffset > iDrawDistanceBeforeTargetsPixels) // off screen
651+
fLastBeatToDraw -= fSearchDistance;
652+
else // on screen
653+
fLastBeatToDraw += fSearchDistance;
667654

668-
float endOffset = ArrowEffects::GetYOffset(pPlayerState, 0, lastBeatArgs.beat, fPeakYOffset, bIsPastPeakYOffset, true);
669-
670-
pixelsPerBeat = ((lastBeatArgs.beat / endOffset) * (lastKnownBPS / lastBeatArgs.bps_out)) * lastKnownRate;
655+
fSearchDistance /= 2;
671656
}
672657

673-
firstBeat = fFirstBeatToDraw + iDrawDistanceAfterTargetsPixels * pixelsPerBeat;
674-
675-
if ( !bBoomerang )
676-
{
677-
lastBeat = fLastBeatToDraw + iDrawDistanceBeforeTargetsPixels * pixelsPerBeat;
678-
}
679-
else
658+
fSearchDistance = 10;
659+
for (int i = 0; i<NUM_ITERATIONS; i++)
680660
{
681-
// Probe for last note to draw. Worst case is 0.25x + boost.
682-
// Adjust search distance so that notes don't pop onto the screen.
683-
float fSearchDistance = 10;
684-
float fSpeedMultiplier = pPlayerState->GetDisplayedTiming().GetDisplayedSpeedPercent(pPlayerState->GetDisplayedPosition().m_fSongBeatVisible, pPlayerState->GetDisplayedPosition().m_fMusicSecondsVisible);
685-
const int NUM_ITERATIONS = 20;
661+
bool bIsPastPeakYOffset;
662+
float fPeakYOffset;
663+
float fYOffset = ArrowEffects::GetYOffset(pPlayerState, 0, fFirstBeatToDraw, fPeakYOffset, bIsPastPeakYOffset, true);
686664

687-
for (int i = 0; i<NUM_ITERATIONS; i++)
688-
{
689-
bool bIsPastPeakYOffset;
690-
float fPeakYOffset;
691-
float fYOffset = ArrowEffects::GetYOffset(pPlayerState, 0, fLastBeatToDraw, fPeakYOffset, bIsPastPeakYOffset, true);
692-
693-
if (bBoomerang && !bIsPastPeakYOffset)
694-
fLastBeatToDraw += fSearchDistance;
695-
else if (fYOffset > iDrawDistanceBeforeTargetsPixels) // off screen
696-
fLastBeatToDraw -= fSearchDistance;
697-
else // on screen
698-
fLastBeatToDraw += fSearchDistance;
699-
700-
fSearchDistance /= 2;
701-
}
665+
if (bBoomerang && !bIsPastPeakYOffset)
666+
fFirstBeatToDraw -= fSearchDistance;
667+
else if (fYOffset < iDrawDistanceAfterTargetsPixels) // off screen
668+
fFirstBeatToDraw += fSearchDistance;
669+
else // on screen
670+
fFirstBeatToDraw -= fSearchDistance;
702671

703-
if( fSpeedMultiplier < 0.75f )
704-
fLastBeatToDraw = min(fLastBeatToDraw, pPlayerState->GetDisplayedPosition().m_fSongBeat + 16);
672+
fSearchDistance /= 2;
673+
}
705674

706-
lastBeat = fLastBeatToDraw;
675+
if (fSpeedMultiplier < 0.75f)
676+
{
677+
fFirstBeatToDraw = min(fFirstBeatToDraw, pPlayerState->GetDisplayedPosition().m_fSongBeat + 16);
678+
fLastBeatToDraw = min(fLastBeatToDraw, pPlayerState->GetDisplayedPosition().m_fSongBeat + 16);
707679
}
680+
681+
firstBeat = fFirstBeatToDraw;
682+
lastBeat = fLastBeatToDraw;
708683
}
709684

710685
void NoteField::CalcPixelsBeforeAndAfterTargets()

0 commit comments

Comments
 (0)