2013-08-21 45 views
3

CompositionTarget.Rendering事件是構建遊戲主循環的完美之處。它基本上以vsync的速率(通常爲60 Hz)觸發。在CompositionTarget.Rendering中可以做什麼?

發生就在之前,合成樹中的對象被渲染。在將動畫和佈局應用於合成樹之後,渲染事件將路由到指定的事件處理程序

per-frame animation how-to文章解釋了一點點。

請注意,您的事件處理程序方法在計算佈局後調用。但是,您可以在事件處理程序方法中修改佈局,這意味着佈局將在渲染之前再次計算。

此基礎上,它的處理器內部代碼的規則是:

  • 避免更改佈局
  • 返回快速

什麼其他的陷阱有哪些?什麼非顯而易見的操作會導致另一個佈局傳遞?我在處理程序中究竟有多少時間?

回答

4

我認爲它的主要目的是啓用無定時器動畫,例如那些使用物理元素(如重力)的地方,需要精確的定時時間。但它是不是一個遊戲圖形的好地方... WPF是不是一個遊戲語言和嚴重的遊戲將運行順利使用它,因爲有太多的開銷。如果你想寫一個.NET遊戲,然後使用XNA

從書「WPF控件開發偷跑:構建高級用戶體驗」:

有些讀者可能會認識到這一點的方法和更高端的顯卡 子系統喜歡的DirectX之間的相似性。不要把CompositionTarget.Rendering錯誤地指向創建一個基於WPF的遊戲圖形引擎。高端圖形和超高幀率並不是WPF動畫這一特定方面的目標。

與DispatcherTimer方法類似,基於CompositionTarget.Rendering 的動畫也沒有時間限制。然而,這些事件會與渲染線程同步,導致 比DispatcherTimer更平滑的動畫。也不需要啓動並停止計時器,但您可能必須分離並附加事件處理程序以提高 的性能。

+4

我很清楚所有這一切,我仍然想在WPF中製作遊戲。 –

+2

@AnsisMalins爲什麼?根據定義,這種方法是不合適的。如果您在需要使用螺絲刀時使用小刀,請不要感到驚訝,如果您滑動並割傷手。 – Basic

1

雖然研究別的東西,我偶然在this piece of advice

如有下列行爲發生的佈局傳遞過程被再次調用:

  • 子對象添加到採集。
  • LayoutTransform應用於子對象。
  • 爲子對象調用UpdateLayout方法。 當用影響measurearrange遍歷的元數據標記的依賴項屬性值發生更改時。

[..]

更新,而不是更換一個的RenderTransform

您可以更新改造,而不是取代它的RenderTransform屬性的值。在涉及動畫的場景中尤其如此。通過更新現有的變換,可以避免啓動不必要的佈局計算。