CompositionTarget.Rendering事件是构建游戏主循环的最佳选择。它基本上以vsync的速率发射(通常为60 Hz)。
在之前发生渲染合成树中的对象。在将动画和布局应用于合成树后,Rendering事件将路由到指定的事件处理程序。
per-frame animation how-to文章解释了一点。
请注意,在计算布局后调用事件处理程序方法。但是,您可以在事件处理程序方法中修改布局,这意味着在呈现之前将再次计算布局。
基于此,其处理程序内的代码规则为:
还有其他什么问题?哪些非显而易见的行为导致另一个布局通过?我在处理程序中有多少时间?
答案 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方法。 当使用影响measure或arrange次传递的元数据标记的依赖项属性的值发生更改时。
[..]
更新而不是替换RenderTransform
您可以更新Transform而不是将其替换为RenderTransform属性的值。在涉及动画的场景中尤其如此。通过更新现有的Transform,您可以避免启动不必要的布局计算。