我正在測量一個簡單的WPF動畫幀之間的時間。穿孔器說應用程序的執行速度爲〜60fps,所以我預計幀之間的時間約爲16.6ms,而且幾乎沒有偏差。爲什麼WPF中的幀頻不規則並不限制顯示器刷新?
public MainWindow()
{
...
CompositionTarget.Rendering += Rendering;
}
List<long> FrameDurations = new List<long>();
private long PreviousFrameTime = 0;
private void Rendering(object o, EventArgs args)
{
FrameDurations.Add(DateTime.Now.Ticks - PreviousFrameTime);
PreviousFrameTime = DateTime.Now.Ticks;
}
有兩件事情讓我很吃驚:幀之間
- 時間相當不規則
- 幀之間的時間是8ms的〜。我本來期望顯示器的刷新速率會在幀之間設定一個較低的時間限制(即每幀之間60Hz = 16.6ms,而任何速度都是毫無意義的)。
Ÿ - 幀計數
可能的混雜因素
- 定時誤差
- 如果CompositionTarget - 在蜱框架(10,000蜱= 1毫秒)
X之間的時間。渲染實際上並不涉及單個框架的繪製
我使用的項目:馬庫斯指出,我可以用RenderingEventArgs.RenderingTime.Ticks代替DateTime.Now.Ticks SimpleWindow.zip
===編輯
。我重複了跑步,得到了非常不同的結果。唯一的區別是定時方法:
DateTime.Now.Ticks
RenderingEventArgs.RenderingTime.Ticks
數據從RenderingEventArgs產生的數據更接近預計16.6ms /幀,並且是一致的。
- 我不知道爲什麼DateTime.Now和RenderingEventArgs會產生這樣非常不同的數據。
- 假設RenderingEventArgs正在產生正確的時間,那些時間不是預期的16.6ms仍然有點令人不安。
如果顯示屏每16.6ms更新一次並且WPF每14.9ms更新一次,那麼我們可以預料到一個競爭條件會導致撕裂。也就是說,當顯示器試圖讀取圖像時,大約每10幀WPF都會嘗試寫入圖像。
秒錶類是去避免計時器誤差 – 2011-04-28 01:12:30
這種「可能」是有益的方式:http://rhnatiuk.wordpress.com/2008/12/21/wpf-video-playback-problems/ - 我不確定這個問題有多相關,但我認爲它今天仍然存在。 – 2011-04-28 07:03:53
@Tristan @Martin時間測量根本不需要!你可以[將EventArgs轉換爲RenderingEventArgs來獲取RenderTime](http://msdn.microsoft.com/en-us/library/system.windows.media.compositiontarget.shipping(VS.95).aspx) – 2011-04-28 10:32:54