2011-10-12 58 views
8

我使用C#在WPF中創建了一個簡單的車輛和彈丸模擬遊戲。我需要有一個恆定的幀速率(即我需要知道在每個幀中以一定的速度移動一個物體需要多少時間)。通過這種方式,我可以訂閱一個事件,根據遊戲的物理位置計算並更新位置到CompositionTarget.Rendering事件。WPF中持續幀率遊戲

CompositionTarget.Rendering += UpdatePositions; 

我GOOGLE了一會兒,沒有找到答案。 WPF seem to be arbitrary中的fps,並使用秒錶來了解一幀和前一幀之間所經過的時間不會乾淨。

我想也創造我自己的幀速率,通過調用UpdatePositions每毫秒的一些量,並希望相應地發生渲染,有一個平滑的動畫。這似乎是重新發明了輪子,我不能想到一種以乾淨和簡單的方式實現這一點的方式。

謝謝!

+7

除了最基本的遊戲開發外,不要使用WPF。它真的不打算用於這種用途。如果你想用.NET創建遊戲,你應該看看XNA框架。 – dlev

+0

我認爲這是最基本的遊戲開發,我已經工作了很多,所以我真的需要理清我的幀率問題...... – Nicolas

+0

「使用秒錶來了解幀與幀之間經過的時間以前的一個根本就不會乾淨「 - 怎麼樣? – EboMike

回答

7

這是不可能得到在WPF恆定的幀率。 WPF基於動態幀速率的思想,這使得它幾乎無用於任何遊戲開發。

一些相關的信息:

Why is Frame Rate in WPF Irregular and Not Limited To Monitor Refresh?

http://rhnatiuk.wordpress.com/2008/12/21/wpf-video-playback-problems/

正如其他人所指出的解決方案是,不幸的是,不要用WPF進行遊戲開發。我已經廣泛地使用WPF動畫,並且讓WPF中的任何東西順利地動畫是一種絕對的痛苦(如果你確實想要這樣做,我已經在這裏寫下了幾個best practices)。

我相信還有很多其他原因WPF是不利於遊戲的開發。其中一個例子是,您無法在WPF中創建全屏應用程序,因爲WPF應用程序始終處於窗口狀態。這意味着你無法改變你的遊戲的分辨率,使其在全屏時變得平滑,這實際上意味着你不能在WPF中創建一個全屏遊戲,並期待好的結果。

如果你對一般的遊戲或遊戲開發非常認真,這不僅僅是一個原型或者只是爲了好玩,那麼我建議你把WPF和別的東西一起丟掉,否則你只會讓自己失望,低質量。

+0

在您說的這些最佳實踐中:「CompositionTarget.Rendering事件導致WPF持續動畫,如果你使用這個事件,請在每一個機會上分離它。「分離事件意味着什麼?謝謝 – Nicolas

+0

這只是意味着連接到CompositionTarget.Rendering並不是最佳的,因爲它可能會影響性能,即使您在事件處理程序中沒有執行任何操作。 MS建議分離/取消訂閱(CompositionTarget.Rendering- = Foo),只要不是絕對需要收聽該事件。 –

+0

此建議直接來自MS:http://msdn.microsoft.com/en-us/library/bb613584.aspx –

2

即使你不想去與XNA遊戲開發考慮閱讀時間如何管理是有做 - 固定幀率是沒有必要等於或需要穩定的遊戲時間。嘗試根據遊戲時間(可能與實時相同或基於實時定律計算 - 即如果您希望擁有「快進」模式或暫停遊戲),而不是幀速率。

繼2個鏈接討論「遊戲時間」,「實時」和相關概念:http://blogs.msdn.com/shawnhar/archive/2007/07/25/understanding-gametime.aspxhttp://blogs.msdn.com/shawnhar/archive/2007/11/23/game-timing-in-xna-game-studio-2-0.aspx