2013-08-21 44 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属性的值。在涉及动画的场景中尤其如此。通过更新现有的变换,可以避免启动不必要的布局计算。