// Copyright Epic Games, Inc. All Rights Reserved. #include namespace zen { void FilteredRate::Start() { if (StartTimeUS == (uint64_t)-1) { uint64_t Expected = (uint64_t)-1; if (StartTimeUS.compare_exchange_strong(Expected, Timer.GetElapsedTimeUs())) { LastTimeUS = StartTimeUS.load(); } } } void FilteredRate::Stop() { if (EndTimeUS == (uint64_t)-1) { uint64_t Expected = (uint64_t)-1; EndTimeUS.compare_exchange_strong(Expected, Timer.GetElapsedTimeUs()); } } void FilteredRate::Update(uint64_t Count) { if (LastTimeUS == (uint64_t)-1) { return; } uint64_t TimeUS = Timer.GetElapsedTimeUs(); uint64_t TimeDeltaUS = TimeUS - LastTimeUS; if (TimeDeltaUS >= 2000000) { uint64_t Delta = Count - LastCount; uint64_t PerSecond = (Delta * 1000000) / TimeDeltaUS; FilteredPerSecond = (PerSecond + (LastPerSecond * 7)) / 8; LastPerSecond = PerSecond; LastCount = Count; LastTimeUS = TimeUS; } } uint64_t FilteredRate::GetCurrent() const { if (LastTimeUS == (uint64_t)-1) { return 0; } return FilteredPerSecond; } uint64_t FilteredRate::GetElapsedTimeUS() const { if (StartTimeUS == (uint64_t)-1) { return 0; } if (EndTimeUS == (uint64_t)-1) { return 0; } return EndTimeUS - StartTimeUS; } bool FilteredRate::IsActive() const { return (StartTimeUS != (uint64_t)-1) && (EndTimeUS == (uint64_t)-1); } uint64_t GetBytesPerSecond(uint64_t ElapsedWallTimeUS, uint64_t Count) { if (ElapsedWallTimeUS == 0) { return 0; } return Count * 1000000 / ElapsedWallTimeUS; } } // namespace zen