首先,它有助于生成移动均线。 这对最近事件的加权更大。
为此,请保留一堆样本(循环缓冲区或列表),每个样本都有一对进度和时间。 保留最近的N秒样本。 然后生成样本的加权平均值:
totalProgress += (curSample.progress - prevSample.progress) * scaleFactor
totalTime += (curSample.time - prevSample.time) * scaleFactor
其中scaleFactor从0 ... 1线性地变为过去的时间的反函数(因此,对新近采样的权重更大)。 您当然可以使用此权重。
最后,您可以获得平均变化率:
averageProgressRate = (totalProgress / totalTime);
您可以通过将剩余进度除以该数字来计算出预计到达时间。
但是,尽管这为您提供了一个很好的趋势数字,但您还有另一个问题-抖动。 如果由于自然变化而导致您的进度有所波动(嘈杂),例如 也许您正在使用它来估计文件下载-您会注意到噪音很容易导致您的ETA跳动,尤其是在将来很长一段时间(几分钟或更长时间)的情况下。
为避免抖动对您的ETA造成太大影响,您希望此平均更改率速率对更新进行缓慢响应。 解决此问题的一种方法是保持averageProgressRate的缓存值不变,而不是立即将其更新为您刚刚计算出的趋势数,而是将其模拟为具有质量的重物,然后将模拟“力”缓慢施加 将其移向趋势数。 对于质量,它具有一点惯性,并且不太可能受到抖动的影响。
这是一个粗略的示例:
// desiredAverageProgressRate is com