4

CompositionTarget.Rendering事件是构建游戏主循环的完美之选。它基本上以垂直同步的速率(通常为 60 Hz)触发。

在合成树中的对象被渲染之前发生。在将动画和布局应用到合成树之后,Rendering 事件被路由到指定的事件处理程序。

帧动画操作方法文章解释了更多。

请注意,您的事件处理程序方法是在计算布局后调用的。但是,您可以在事件处理程序方法中修改布局,这意味着在渲染之前将再次计算布局。

基于此,其处理程序内的代码规则是:

  • 避免改变布局
  • 快速返回

还有哪些其他问题?哪些不明显的动作会导致另一个布局传递?我在处理程序中究竟有多少时间?

4

2 回答 2

4

我认为它的主要目的是启用无计时器动画,例如那些使用重力等物理元素的动画,其中需要精确的定期计时。但是它不是游戏图形的好地方... WPF不是一种游戏语言,严重的游戏使用它不会顺利运行,因为开销太大。如果您想编写 .NET 游戏,请使用XNA

从“WPF 控件开发释放:构建高级用户体验”一书中:

一些读者可能会认识到这种方法与 DirectX 等高端图形子系统之间的相似之处。不要将 CompositionTarget.Rendering 误认为是创建基于 WPF 的游戏图形引擎的良好注入点。高端图形和超高帧速率并不是 WPF 动画这一特定方面的目标。

与 DispatcherTimer 方法类似,基于 CompositionTarget.Rendering 的动画也没有时间限制。但是,这些事件与渲染线程同步,从而产生比 DispatcherTimer 更流畅的动画。也不需要启动和停止计时器,尽管您可能必须分离和附加事件处理程序以提高性能。

于 2013-08-21T10:33:56.703 回答
1

在研究其他东西时,我偶然发现了这条建议

如果发生以下任何操作,则会再次调用布局传递过程:

  • 一个子对象被添加到集合中。
  • 将 LayoutTransform 应用于子对象。
  • 为子对象调用 UpdateLayout 方法。当使用影响度量排列通道的元数据标记的依赖属性的值发生更改时。

[..]

更新而不是替换 RenderTransform

您可以更新 Transform 而不是将其替换为 RenderTransform 属性的值。在涉及动画的场景中尤其如此。通过更新现有的 Transform,您可以避免启动不必要的布局计算。

于 2016-02-01T10:58:15.153 回答