嘿,我有一個相當具體的問題。
我正在構建一個節拍器,這個節拍器還顯示了盒子,它們會以 bpm 的給定節拍改變它們的顏色。最高可能的 bpm 為 400bpm,4/4 節拍。這意味著最快的顏色變化應該發生在每:37.5 毫秒。

顏色的變化將持續幾毫秒。
到目前為止,我試圖通過計時器來實作這一點:
timer = new System.Timers.Timer() { AutoReset = true, SynchronizingObject = null };
private async void timer1_Elapsed(object sender, ElapsedEventArgs e)
{
boxViewLast = (BoxView)beatDisplay.Children[(int)lastI];
boxView = (BoxView)beatDisplay.Children[(int)i];
boxViewLast.Color = boxColor;
boxView.Color = transColor;
await Task.Delay((int)BeatMilliseconds);
boxView.Color = boxColor;
lastI = i;
i ;
if (i >= numOfChildren)
{
i = 0;
}
timer.AutoReset = Tempo == 1 && Play;
}
但是在 UI 中,如果顏色變化很快,有時甚至沒有變化,我會看到閃爍。我猜資源被阻塞了,所以改變不能在給定的時間內完成。有沒有辦法讓 UI 更改異步且非常高效?但我也需要一個非常精密的計時器
uj5u.com熱心網友回復:
沒有理由await Task.Delay 在回呼里面。您可以使用計時器來定義回呼之間的間隔:
var lastTime = DateTime.Now;
var times = new List<TimeSpan>(1000);
var timer = new System.Timers.Timer() { Enabled = true, Interval = 32, AutoReset = true};
timer.Elapsed = TimerHandler;
Console.WriteLine("Starting timer");
timer.Start();
await Task.Delay(TimeSpan.FromSeconds(3));
timer.Stop();
foreach (var time in times)
{
Console.WriteLine($"{time.TotalMilliseconds}ms passed");
}
void TimerHandler(object? sender, System.Timers.ElapsedEventArgs e)
{
TimeSpan timePassed = e.SignalTime - lastTime;
times.Add(timePassed);
lastTime = DateTime.Now;
}
它會有點準確:
30.5771ms passed
31.0725ms passed
30.8268ms passed
31.0783ms passed
30.5758ms passed
31.4693ms passed
31.0038ms passed
32.1051ms passed
31.0289ms passed
31.1313ms passed
30.9087ms passed
31.0877ms passed
31.9015ms passed
30.7389ms passed
46.8875ms passed
31.4987ms passed
31.7549ms passed
uj5u.com熱心網友回復:
感謝@Jason,我使用了 SkiaSharp 解決了閃爍的問題。現在更干凈了。但是我還無法解決時間的準確性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/409301.html
標籤:
上一篇:是否可以使用SIMD對C中的非平凡回圈進行矢量化?(重用一個輸入的多重長度5個雙精度點積)
下一篇:Struts1中具有屬性屬性的<bean:message>標記的Struts2等效項是什么?例如:<bean:messagename="user"property
