2009-02-10 81 views
2

我已經使用C#創建了一個WPF應用程序,該應用程序呈現大約50個3D元素,併爲了在場景中移動而動畫化攝像頭。在Windows XP上的WPF視頻撕裂

雖然一切正常,但我注意到隨着相機的移動,出現了難看的視頻撕裂。

我很清楚撕裂的標準原因,即應用程序正在以不同於監視器/適配器垂直同步的速率更新幀。

我也讀過WPF中的默認屏幕更新速率是每秒60幀,XP WPF更新without regard to the montior v-sync

對於某些場景,撕裂是不太明顯的,但往往它分散到足以成爲一個真正的問題。

我真的希望有一個解決方案,畢竟Windows窗體有多年的雙緩衝。如果沒有解決方案,移動到WPF對於許多類型的應用程序來說是一個落後的步驟。

因此,在Windows XP上,如何配置WPF以消除撕裂?

我在尋找更有幫助的答案,然後「轉移到Vista」。對於這個應用程序的許多未來用戶來說,這絕對是不可能的。

+1

我相信微軟的反應是它已經固定在Vista上。所以,轉到Vista。我自己搬到了Linux ... – 2009-02-10 14:05:59

回答

2

還沒有答案,當然有WPF開發人員的數量有人看到了這個問題?

在此期間,我調查了一些更多,並遇到Timeline.DesiredFrameRate財產。

隨着我的顯示器運行在50hz垂直刷新,我試圖將其設置爲50 FPS,希望這會帶來同步。不幸的是,這對撕裂沒有影響。

但是,我必須將它應用到我使用BeginAnimation()創建的(在代碼中)的單個特定動畫。我不確定這將如何影響「全球」幀速率。

相反,我希望需要在更全局的層面上做到這一點,比如在視口上,但是我無法在視口對象上找到DesiredFramerate屬性。

另一個需要關注的領域是RenderCapability.Tier,但我還沒有時間仔細查看。

[更新]

沒有解決方案,但一個有用的提示。要全局設置DesiredFramerate(即在視口中所有的動畫),您可以覆蓋PropertyMetadata爲 Timeline.DesiredFrameRateProperty依賴屬性:

// Set the global desired framerate to 50 frames per second 
Startup += delegate(object sender, StartupEventArgs e) 
{ 
Timeline.DesiredFrameRateProperty.OverrideMetadata(typeof(Timeline), 
    new PropertyMetadata(50)); 
}; 

最好是把這個標準WPF應用程序類的構造函數。

不幸的是,這並沒有解決我的問題,因爲即使將其設置爲FPS,也不能使用顯示器v-sync同步足夠準確。

雖然知道這一點很方便,特別是如果您的移動動畫緩慢並想通過將FPS設置爲比默認60fps低很多來節省CPU使用率。

[更新]

設置DesireFrameRate一些非常高的值,如100 +似乎減少但不能消除閃爍。然而,一個很大的缺點是CPU(在我的4臺PC上)達到35%。