我與通過這段代碼提出的一個問題掙扎:爲什麼這個異步方法阻塞UI線程?
private int FPS = 60;
void WebView_LoadCompleted(object sender, NavigationEventArgs e)
{
WebviewContentWorker();
}
private async void WebviewContentWorker()
{
WebViewBrush wvb = new WebViewBrush();
wvb.SetSource(WebView);
wvb.Redraw(); //we must redraw at least once before collapsing the WebView
WebView.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
while (true)
{
webViewContent.Background = wvb; //webViewContent is a canvas
await Task.Delay(1000/FPS);
wvb.Redraw();
}
}
我想在這裏實現的是找到XAML的WebView
,我覺得很邋遢一種解決方法。我希望能夠在其上繪製東西,但我不能這樣做,我基本上在做的是重複拍攝WebView
(使用WebViewBrush
)的快照(基於int FPS
字段),然後設置Background
屬性帶有此快照的名爲「webViewContent
」的畫布。目的是讓動畫顯示在畫布上,同時仍然可以在畫布上繪製動畫(如果我不做這些快速快照,畫布將顯示靜止圖像)。
它現在工作正常(我成功地將任何Tapped
事件重定向到WebView
的內部,以便點擊按鈕/鏈接/ ...被正確處理),但它有點遲緩。緩慢的位是wvb.Redraw()
我想知道如何提高我的線程的性能。它看起來像UI是期間Task.Delay
但被封鎖否則...
任何輸入/建議是非常歡迎!
編輯: 這裏是我超時了Redraw
電話(我認爲這是什麼原因造成的問題,因爲去掉它的應用非常敏感):
while (true)
{
webViewContent.Background = wvb;
await Task.Delay(1000/FPS);
sw.Reset();
sw.Start();
wvb.Redraw();
sw.Stop();
System.Diagnostics.Debug.WriteLine(sw.Elapsed.TotalMilliseconds);
}
這給了我這些結果在輸出窗口:
0,094
0,058
0,041
0,053
0,057
0,038
0,032
0,033
0,032
0,038
0,035
0,03
0,042
0,028
0,044
0,031
0,033
0,029
0,034
0,03
0,052
0,029
所以沒有那麼多畢竟...
您的'Redraw'方法運行多長時間?另外,有60 FPS真的是必要的嗎?你可以降低它一點,而不顯示太生澀? – Servy
我今天試過使用'StopWatch' ealier,我相信'(double)Elapsed.TotalMilliseconds'屬性返回了0,1XXX和0,3XXX之間的值。 – Max
如果花費了三分之一毫秒,那麼即使每秒完成60次,我也看不到它會如何阻擋用戶界面足夠長的時間才能被某個人察覺。 UI仍然有足夠的時間讓消息循環保持響應。也許你沒有在與你實際使用它相同的條件下正確計時。 – Servy