Partager via


Comment : effectuer une restitution par intervalle de trame à l'aide de CompositionTarget

Mise à jour : novembre 2007

Le moteur d'animation WPF propose de nombreuses fonctionnalités permettant de créer une animation par trame. Toutefois, il existe des scénarios d'application dans lesquels vous avez besoin de mieux contrôler la restitution par trame. L'objet CompositionTarget permet de créer des animations personnalisées sur la base d'un rappel image par image.

CompositionTarget est une classe statique représentant la surface d'affichage sur laquelle votre application est dessinée. L'événement Rendering est déclenché chaque fois que la scène de l'application est dessinée. La fréquence d'images du rendu correspond au nombre de fois que la scène est dessinée par seconde.

Remarque :

Pour obtenir un exemple de code complet utilisant CompositionTarget, consultez Utilisation du CompositionTarget, exemple.

Exemple

L'événement Rendering est déclenché pendant le processus de restitution WPF. L'exemple suivant montre comment inscrire un délégué EventHandler dans la méthode Rendering statique de CompositionTarget.

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

Vous pouvez utiliser la méthode du gestionnaire d'événements de rendu pour créer un contenu de dessin personnalisé. Cette méthode du gestionnaire d'événements est appelée une fois par trame. À chaque fois que WPF marshale les données de rendu persistantes dans l'arborescence visuelle sur le graphique des scènes de composition, la méthode du gestionnaire d'événements est appelée. En outre, si des modifications dans l'arborescence d'éléments visuels forcent la mise à jour du graphique des scènes de composition, votre méthode de gestionnaire d'événements est également appelée. Notez que votre gestionnaire d'événements est appelé une fois la disposition calculée. Vous pouvez, toutefois, modifier la disposition dans la méthode de gestionnaire d'événements, auquel cas la disposition sera de nouveau calculée avant le rendu.

L'exemple suivant indique comment fournir le dessin personnalisé dans une méthode de gestionnaire d'événements CompositionTarget. Dans ce cas, la couleur d'arrière-plan de Canvas est dessinée avec une valeur de couleur selon la position des coordonnées de la souris. Si vous déplacez la souris à l'intérieur de Canvas, sa couleur d'arrière-plan change. De plus, la fréquence d'images moyenne est calculée, selon le temps écoulé actuel et le nombre total de trames rendues.

// 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));
}

Il est possible que vous observiez que votre dessin personnalisé s'exécute à des vitesses différentes sur divers ordinateurs. Cela est dû au fait que votre dessin personnalisé n'est pas indépendant de la fréquence d'images. Selon le système que vous exécutez et la charge de travail de ce système, l'événement Rendering peut être appelé un nombre différent de fois par seconde. Pour plus d'informations sur la détermination des fonctionnalités matérielles et des performances d'un périphérique exécutant une application WPF, consultez Couches de rendu graphiques.

L'ajout ou la suppression d'un délégué EventHandler de rendu pendant le déclenchement de l'événement sera différé jusqu'à la fin de ce déclenchement. Cette approche est cohérente avec la manière dont les événements basés sur MulticastDelegate sont contrôlés dans CLR (Common Language Runtime). Notez également qu'il n'est pas garanti que les événements de rendu soient appelés dans un ordre particulier. Si plusieurs délégués EventHandler comptent sur un ordre particulier, vous devez enregistrer un événement Rendering unique et multiplexer vous-même les délégués dans l'ordre approprié.

Utilisation de Perforator pour analyser le comportement du rendu

Perforator est un outil de profilage des performances WPF qui permet d'analyser le comportement du rendu. Il affiche un ensemble de valeurs qui vous permettent d'analyser le comportement du rendu très spécifique à certains endroits de votre application. Dans cet exemple d'application PhotoDemo, Perforator affiche une fréquence d'images de rendu de 60 images par seconde.

Fenêtre principale Perforator

Fenêtre principale Perforateur avec données de rendu

Pour plus d'informations, consultez Outils de profilage des performances pour WPF.

Voir aussi

Concepts

Vue d'ensemble du rendu graphique de Windows Presentation Foundation

Outils de profilage des performances pour WPF

Référence

CompositionTarget