解决定时器在Windows上不准的问题,主要是高精度时钟不准确的问题。
Windows 10:默认系统时钟分辨率为 15.625ms(64Hz)。Task.Delay(1) 被对齐到最近的时钟刻度,实际延时 ~12-15ms(测试数据:13.0369ms、14.4563ms)。
Android:定时器分辨率通常为 10-20ms(视设备和系统版本),Task.Delay(1) 可能延时 10-20ms,受功耗优化(如 Doze 模式)影响。
需要使用更高精度的硬件时钟,计时:Stopwatch.GetTimestamp 和 GetElapsedTime 使用硬件时钟(纳秒级精度)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
await Task.Run(async() =>
{
int k = 0;
int n = 100;
int m = 60;
int millisecond = 5;
var _stopwatch = Stopwatch.StartNew();
for (int i = 0; i < 200 * 60; i++)
{
var start = Stopwatch.GetTimestamp();
while (Stopwatch.GetElapsedTime(start).TotalMilliseconds < millisecond)
{
Thread.SpinWait(10);
}
_dataPoints.Add(m_dataPoints[k++]);
}
_stopwatch?.Stop();
await Task.Delay(100);
Debug.WriteLine($"Total: {_stopwatch.Elapsed.TotalSeconds}");
});
|