我有一个应用程序,在执行后台任务时,显示一个进度条,其中包含"估计剩余时间"计算(例如"剩余5秒")和"估计完成时间"(例如"在12:59:59完成" "),或者我称之为ETA.
用于计算此ETA的算法基本上采用随时间推移的"滚动平均值":
1.每个进度事件被添加到具有当前时间的队列中.
2.在一定持续时间(例如10秒)之后,从队列中移除项目.
3. ETA是从队列中的第一个和最后一个项目推断出来的.
如果您关心,源代码可用:ETACalculator.cs
但是,存在抖动问题.随着每个进度事件被添加到计算中,ETA将稍微更新.让我们说ETA只是改变了0.1s.这种小抖动很容易导致ETA"颤动".例如,我没有看到5s,4s,3s等的平滑进展,而是看到了5-5-5-4-5-4-5-4-4-4-4-4.
我只想把更新减少到每秒1次,但是进度条不太顺畅,而且我真的希望"实际"减速能够实时显示.
我遇到了一个简单的算法,可以减少这种跳跃的抖动.如何消除抖动?
Dre*_*ann 11
将实际的抖动进度和显示的进度分成两个单独的变量.
像现在一样更新紧张的进度.
在定期(相对快速)的时间间隔内,更新显示的进度以接近实际进度.
一种简单的方法算法是平均这两个值
display_progress = (display_progress + actual_progress) / 2
Run Code Online (Sandbox Code Playgroud)
这将抑制价值以反映过去的价值而不仅仅是直接价值.
您还可以使用以下方法优化平滑度:
display_progress = (P) * display_progress + (1.0-P) * actual_progress
Run Code Online (Sandbox Code Playgroud)
和P之间的常数值在哪里.0.01.0
编辑:
这是可以使用的许多过滤器之一.这个很好,因为它不需要太多的簿记.
然而,获得完美的输出并不是一种选择,因为缺陷在你的输入中."抖动"和"实际减速"之间的差异只有在发生之后才能观察到.