【发布时间】:2013-06-20 23:44:24
【问题描述】:
我正在努力解决这段代码引发的问题:
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字段)和然后使用此快照设置名为“webViewContent”的画布的Background 属性。目的是在画布上显示动画,同时仍然能够在其上进行绘制(如果我不做这些快速快照,画布将显示静止图像)。
它现在工作正常(我成功地将任何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 真的有必要吗?你能把它调低一点,显示器不会太生涩吗? -
我今天尝试使用
StopWatchealier,我相信(double) Elapsed.TotalMilliseconds属性返回的值介于0,1XXX 和0,3XXX 之间。 -
如果它需要 1/3 毫秒,那么即使每秒执行 60 次,我也看不出它会如何阻塞 UI 足够长的时间以被人察觉。这仍然是 UI 的消息循环保持响应的充足时间。也许您没有在实际使用它的相同条件下正确计时。
-
我用正确的结果编辑了我的第一篇文章以及我是如何计时的,看看吧!
标签: c# multithreading windows-runtime async-await