在CompositionTarget.Rendering中我可以做什么?

时间:2013-08-21 09:05:49

标签: wpf performance animation vsync

CompositionTarget.Rendering事件是构建游戏主循环的最佳选择。它基本上以vsync的速率发射(通常为60 Hz)。

  

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

per-frame animation how-to文章解释了一点。

  

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

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

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

还有其他什么问题?哪些非显而易见的行为导致另一个布局通过?我在处理程序中有多少时间?

2 个答案:

答案 0 :(得分:4)

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

从“WPF Control Development Unleashed:构建高级用户体验”一书中可以看出:

  

有些读者可能会认识到这种方法与高端图形之间的相似性   像DirectX这样的子系统。不要错误使用CompositionTarget.Rendering进行良好的注入   指向创建基于WPF的游戏图形引擎。高端显卡和超高清   帧速率不是WPF动画这一特定方面的目标。

     

与DispatcherTimer方法类似,基于CompositionTarget.Rendering的动画   也没有时间限制。但是,这些事件与生成的渲染线程同步   比DispatcherTimer更流畅的动画。也没有必要开始和   停止计时器,虽然您可能需要分离并附加事件处理程序以进行改进   性能

答案 1 :(得分:1)

在研究别的东西时,我偶然发现了this piece of advice

  

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

     
      
  • 将子对象添加到集合中。
  •   
  • LayoutTransform应用于子对象。
  •   
  • 为子对象调用UpdateLayout方法。   当使用影响measurearrange次传递的元数据标记的依赖项属性的值发生更改时。
  •   
     

[..]

     

更新而不是替换RenderTransform

     

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