mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-10 10:08:18 +00:00
Faster and more precise demo skipping
- Approximate index of wanted keyframe to decrease linear search time. - Only apply the magic `-5` to the Keyframe calculation, to make seeking with the mouse more accurate. - After the method returns, the specified tick will be the _next_ tick being played instead of being the current tick.
This commit is contained in:
parent
334bdad922
commit
76cefa1c85
|
@ -939,19 +939,16 @@ int CDemoPlayer::SetPos(int WantedTick)
|
||||||
if(!m_File)
|
if(!m_File)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
// -5 because we have to have a current tick and previous tick when we do the playback
|
WantedTick = clamp(WantedTick, m_Info.m_Info.m_FirstTick, m_Info.m_Info.m_LastTick);
|
||||||
WantedTick = clamp(WantedTick, m_Info.m_Info.m_FirstTick, m_Info.m_Info.m_LastTick) - 5;
|
const int KeyFrameWantedTick = WantedTick - 5; // -5 because we have to have a current tick and previous tick when we do the playback
|
||||||
|
const float Percent = (KeyFrameWantedTick - m_Info.m_Info.m_FirstTick) / (float)(m_Info.m_Info.m_LastTick - m_Info.m_Info.m_FirstTick);
|
||||||
|
|
||||||
// get correct key frame
|
// get correct key frame
|
||||||
int KeyFrame = 0;
|
int KeyFrame = clamp((int)(m_Info.m_SeekablePoints * Percent), 0, m_Info.m_SeekablePoints - 1);
|
||||||
while(KeyFrame < m_Info.m_SeekablePoints - 1 && m_pKeyFrames[KeyFrame].m_Tick < WantedTick)
|
while(KeyFrame < m_Info.m_SeekablePoints - 1 && m_pKeyFrames[KeyFrame].m_Tick < KeyFrameWantedTick)
|
||||||
{
|
|
||||||
KeyFrame++;
|
KeyFrame++;
|
||||||
}
|
while(KeyFrame > 0 && m_pKeyFrames[KeyFrame].m_Tick > KeyFrameWantedTick)
|
||||||
while(KeyFrame > 0 && m_pKeyFrames[KeyFrame].m_Tick > WantedTick)
|
|
||||||
{
|
|
||||||
KeyFrame--;
|
KeyFrame--;
|
||||||
}
|
|
||||||
|
|
||||||
// seek to the correct key frame
|
// seek to the correct key frame
|
||||||
io_seek(m_File, m_pKeyFrames[KeyFrame].m_Filepos, IOSEEK_START);
|
io_seek(m_File, m_pKeyFrames[KeyFrame].m_Filepos, IOSEEK_START);
|
||||||
|
@ -961,7 +958,7 @@ int CDemoPlayer::SetPos(int WantedTick)
|
||||||
m_Info.m_PreviousTick = -1;
|
m_Info.m_PreviousTick = -1;
|
||||||
|
|
||||||
// playback everything until we hit our tick
|
// playback everything until we hit our tick
|
||||||
while(m_Info.m_PreviousTick < WantedTick && IsPlaying())
|
while(m_Info.m_NextTick < WantedTick)
|
||||||
DoTick();
|
DoTick();
|
||||||
|
|
||||||
Play();
|
Play();
|
||||||
|
|
Loading…
Reference in a new issue