如何:使用 CompositionTarget 以每帧间隔呈现

更新:2007 年 11 月

WPF 动画引擎为创建基于帧的动画提供了许多功能。但是,在有些应用程序方案中,您需要基于每个帧来以更细的粒度控制呈现。使用 CompositionTarget 对象,可以基于每个帧回调来创建自定义动画。

CompositionTarget 是一个静态类,表示您的应用程序要在其上进行绘制的显示图面。每次绘制应用程序的场景时,都会引发 Rendering 事件。呈现帧速率是指每秒绘制场景的次数。

说明:

有关使用 CompositionTarget 的完整代码示例,请参见CompositionTarget 的用法示例

示例

在 WPF 呈现过程中,会激发 Rendering 事件。下面的示例演示如何向 CompositionTarget 上的静态 Rendering 方法中注册 EventHandler 委托。

// Add an event handler to update canvas background color just before it is rendered.
CompositionTarget.Rendering += UpdateColor;

您可以使用自己的呈现事件处理程序方法创建自定义绘图内容。对每帧调用一次此事件处理程序方法。每次 WPF 将可视化树中的持久呈现数据封送到组合场景关系图中时,都会调用您的事件处理程序方法。另外,如果更改可视化树将强制更新组合场景关系图,也会调用您的事件处理程序方法。请注意,计算布局后会调用您的事件处理程序方法。但是,您可以修改您的事件处理程序方法中的布局,这意味着在呈现之前将再计算一次布局。

下面的示例演示如何在 CompositionTarget 事件处理程序方法中提供自定义绘图。在本例中,Canvas 的背景色是基于鼠标的坐标位置,用颜色值绘制的。如果您将鼠标放在 Canvas 内部,则它的背景色将发生变化。另外,将基于当前的运行时间和所呈现帧的总数来计算平均帧速率。

// Called just before frame is rendered to allow custom drawing.
protected void UpdateColor(object sender, EventArgs e)
{
    if (_frameCounter++ == 0)
    {
        // Starting timing.
        _stopwatch.Start();
    }

    // Determine frame rate in fps (frames per second).
    long frameRate = (long)(_frameCounter / this._stopwatch.Elapsed.TotalSeconds);
    if (frameRate > 0)
    {
        // Update elapsed time, number of frames, and frame rate.
        myStopwatchLabel.Content = _stopwatch.Elapsed.ToString();
        myFrameCounterLabel.Content = _frameCounter.ToString();
        myFrameRateLabel.Content = frameRate.ToString();
    }

    // Update the background of the canvas by converting MouseMove info to RGB info.
    byte redColor = (byte)(_pt.X / 3.0);
    byte blueColor = (byte)(_pt.Y / 2.0);
    myCanvas.Background = new SolidColorBrush(Color.FromRgb(redColor, 0x0, blueColor));
}

您可能会发现自定义绘图在不同计算机上以不同的速度运行,这是由于自定义绘图与帧速率有关。根据所运行的系统以及系统的工作负荷,每秒调用 Rendering 事件的次数可能会有所不同。有关为运行 WPF 应用程序的设备确定图形硬件功能和性能的信息,请参见图形呈现层

在激发事件时对呈现 EventHandler 委托的添加或移除将延迟到事件完成激发之后。这与基于 MulticastDelegate 的事件在公共语言运行库 (CLR) 中的处理方式一致。另请注意,无法保证按照任何特定顺序来调用呈现事件。如果您有多个 EventHandler 委托依赖特定的顺序,则应当注册一个 Rendering 事件,并按照正确的顺序自己多路复用这些委托。

使用分析器分析呈现行为

分析器是一种用于分析呈现行为的 WPF 性能分析工具。分析器会显示一组值,可以利用这些值分析您的应用程序各个部分中非常具体的呈现行为。在这种情况下,分析器会为 PhotoDemo 示例应用程序显示每秒 60 帧的呈现帧速率。

分析器主窗口

包含呈现数据的 Perforator 主窗口

有关更多信息,请参见 WPF 性能分析工具

请参见

概念

Windows Presentation Foundation 图形呈现概述

WPF 性能分析工具

参考

CompositionTarget