
这个图要从右向左看
3.3 🔑 帧查找(双链表二分查找)
cpp
// 第368-423行
FFramePackage GetFrameToCheck(ABlasterCharacter* HitCharacter, float HitTime)
{
const TDoubleLinkedList<FFramePackage>& History = HitCharacter->GetLagCompensation()->FrameHistory;
// 边界检查
if (History.GetTail()->GetValue().Time > HitTime) return FFramePackage(); // 延迟太大
if (History.GetTail()->GetValue().Time == HitTime) return History.GetTail()->GetValue();
if (History.GetHead()->GetValue().Time <= HitTime) return History.GetHead()->GetValue();
// ═══ 双指针二分查找 ═══
auto* Younger = History.GetHead(); // 较新帧
auto* Older = Younger; // 较旧帧
while (Older->GetValue().Time > HitTime)
{
if (Older->GetNextNode() == nullptr) break;
Older = Older->GetNextNode();
if (Older->GetValue().Time > HitTime) Younger = Older;
}
// 此时: Older.Time <= HitTime < Younger.Time
if (Older->GetValue().Time == HitTime)
return Older->GetValue(); // 精确匹配
return InterpBetweenFrames(Older->GetValue(), Younger->GetValue(), HitTime);
}