方法 : CompositionTarget を使用したフレームの間隔ごとの描画How to: Render on a Per Frame Interval Using CompositionTarget

WPFWPF のアニメーション エンジンには、フレームベースのアニメーションを作成するためのさまざまな機能が用意されています。The WPFWPF animation engine provides many features for creating frame-based animation. ただし、フレームベースの描画をさらにきめ細かく制御することが必要となるアプリケーション シナリオがあります。However, there are application scenarios in which you need finer-grained control over rendering on a per frame basis. CompositionTargetオブジェクトは、フレームごとのコールバックに基づいてカスタム アニメーションを作成する機能を提供します。The CompositionTarget object provides the ability to create custom animations based on a per-frame callback.

CompositionTarget アプリケーションが描画される表示サーフェイスを表す静的クラスです。CompositionTarget is a static class which represents the display surface on which your application is being drawn. Renderingイベントは、アプリケーションのシーンが描画されるたびに発生します。The Rendering event is raised each time the application's scene is drawn. レンダリング フレーム レートは、1 秒あたりのシーンの描画回数です。The rendering frame rate is the number of times the scene is drawn per second.

注意

使用して完全なコード サンプルのCompositionTargetを参照してくださいCompositionTarget のサンプルを使用してします。For a complete code sample using CompositionTarget, see Using the CompositionTarget Sample.

Example

Rendering中にイベントが発生した、WPFWPFレンダリング プロセス。The Rendering event fires during the WPFWPF rendering process. 次の例は、登録する方法を示しています。、 EventHandler 、静的な委任RenderingメソッドCompositionTargetします。The following example shows how you register an EventHandler delegate to the static Rendering method on CompositionTarget.

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

独自の描画イベント ハンドラー メソッドを使用して、描画のカスタム コンテンツを作成できます。You can use your rendering event handler method to create custom drawing content. このイベント ハンドラー メソッドは、フレームごとに 1 回呼び出されます。This event handler method gets called once per frame. WPFWPF がビジュアル ツリーの永続化されたレンダリング データを合成シーン グラフにマーシャリングするたびに、イベント ハンドラー メソッドが呼び出されます。Each time that WPFWPF marshals the persisted rendering data in the visual tree across to the composition scene graph, your event handler method is called. さらに、ビジュアル ツリーに対する変更によって合成シーン グラフが強制的に更新される場合も、イベント ハンドラー メソッドが呼び出されます。In addition, if changes to the visual tree force updates to the composition scene graph, your event handler method is also called. イベント ハンドラー メソッドは、レイアウトが計算された後に呼び出されます。Note that your event handler method is called after layout has been computed. ただし、イベント ハンドラー メソッド内でレイアウトを変更できます。つまり、そのレイアウトは、描画する前にもう一度計算されることになります。However, you can modify layout in your event handler method, which means that layout will be computed once more before rendering.

次の例は指定したカスタムの描画、CompositionTargetイベント ハンドラー メソッド。The following example shows how you can provide custom drawing in a CompositionTarget event handler method. ここでの背景色、Canvasの描画にマウスの座標位置に基づく色の値を使用します。In this case, the background color of the Canvas is drawn with a color value based on the coordinate position of the mouse. 内でマウスを移動する場合、 Canvas、その背景の色を変更します。If you move the mouse inside the Canvas, its background color changes. また、現在の経過時間および描画されたフレームの合計数に基づいて、平均フレーム レートが計算されます。In addition, the average frame rate is calculated, based on the current elapsed time and the total number of rendered frames.

// 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));
}
' Called just before frame is rendered to allow custom drawing.
Protected Sub UpdateColor(ByVal sender As Object, ByVal e As EventArgs)

    If _frameCounter = 0 Then
        ' Starting timing.
        _stopwatch.Start()
    End If
    _frameCounter = _frameCounter + 1

    ' Determine frame rate in fps (frames per second).
    Dim frameRate As Long = CLng(Fix(_frameCounter / Me._stopwatch.Elapsed.TotalSeconds))
    If frameRate > 0 Then
        ' Update elapsed time, number of frames, and frame rate.
        myStopwatchLabel.Content = _stopwatch.Elapsed.ToString()
        myFrameCounterLabel.Content = _frameCounter.ToString()
        myFrameRateLabel.Content = frameRate.ToString()
    End If

    ' Update the background of the canvas by converting MouseMove info to RGB info.
    Dim redColor As Byte = CByte(_pt.X / 3.0)
    Dim blueColor As Byte = CByte(_pt.Y / 2.0)
    myCanvas.Background = New SolidColorBrush(Color.FromRgb(redColor, &H0, blueColor))
End Sub

カスタム描画は、コンピューターごとに異なる速度で実行される場合があります。You may discover that your custom drawing runs at different speeds on different computers. これは、カスタム描画がフレーム レートに依存するためです。This is because your custom drawing is not frame-rate independent. 実行しているシステムと、そのシステムのワークロードに応じて、Rendering異なる回数 1 秒あたりのイベントを呼び出すことができます。Depending on the system you are running and the workload of that system, the Rendering event may be called a different number of times per second. WPFWPF アプリケーションを実行するデバイスのグラフィックス ハードウェアの機能およびパフォーマンスの決定については、「グラフィックスの描画層」を参照してください。For information on determining the graphics hardware capability and performance for a device that runs a WPFWPF application, see Graphics Rendering Tiers.

追加または削除を表示するEventHandlerデリゲート、イベントの発生中には、イベントの終了後まで遅延されますを起動します。Adding or removing a rendering EventHandler delegate while the event is firing will be delayed until after the event is finished firing. これは、一貫性のある方法でMulticastDelegate-ベースのイベントは共通言語ランタイム (CLR) で処理されます。This is consistent with how MulticastDelegate-based events are handled in the Common Language Runtime (CLR). また、描画イベントが特定の順序で呼び出されるかどうかは保証されません。Also note that rendering events are not guaranteed to be called in any particular order. 複数ある場合EventHandler特定の順序に依存するデリゲート、1 つを登録する必要がありますRenderingイベントとマルチプレクシングが適切でデリゲートでは、自分で注文します。If you have multiple EventHandler delegates that rely on a particular order, you should register a single Rendering event and multiplex the delegates in the correct order yourself.

関連項目See Also

CompositionTarget
WPF グラフィックス レンダリングの概要WPF Graphics Rendering Overview