Delen via


Procedure: Weergeven op een interval per frame met behulp van CompositionTarget

De WPF-animatie-engine biedt veel functies voor het maken van op frame gebaseerde animaties. Er zijn echter toepassingsscenario's waarin u nauwkeurige controle over rendering per frame nodig hebt. Het CompositionTarget object biedt de mogelijkheid om aangepaste animaties te maken op basis van een callback per frame.

CompositionTarget is een statische klasse die het weergaveoppervlak aangeeft waarop uw toepassing wordt getekend. De Rendering gebeurtenis wordt geactiveerd telkens wanneer de scène van de toepassing wordt getekend. De weergaveframesnelheid is het aantal keren dat de scène per seconde wordt getekend.

Opmerking

Voor een volledig codevoorbeeld met behulp vanCompositionTarget, zie Using the CompositionTarget Sample.

Voorbeeld

De Rendering gebeurtenis treedt op tijdens het renderproces van WPF. In het volgende voorbeeld ziet u hoe u een EventHandler gemachtigde registreert bij de statische Rendering methode op 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

U kunt de handlermethode voor rendering-gebeurtenissen gebruiken om aangepaste tekeninhoud te maken. Deze gebeurtenis-handlermethode wordt eenmaal per frame aangeroepen. Telkens wanneer WPF de opgeslagen renderinggegevens in de visuele boom naar de scènecompositiegrafiek marshalt, wordt uw gebeurtenishandlermethode aangeroepen. Bovendien wordt uw gebeurtenis-handlermethode ook aangeroepen als wijzigingen in de visuele structuur ervoor zorgen dat de compositiescène grafiek wordt bijgewerkt. Houd er rekening mee dat uw gebeurtenis-handlermethode wordt aangeroepen nadat de indeling is berekend. U kunt de indeling echter wijzigen in uw gebeurtenishandlermethode, wat betekent dat de indeling nogmaals wordt berekend voordat de rendering wordt weergegeven.

In het volgende voorbeeld ziet u hoe u aangepaste tekening kunt opgeven in een CompositionTarget gebeurtenishandlermethode. In dit geval wordt de achtergrondkleur van de kaart Canvas getekend met een kleurwaarde op basis van de coördinaatpositie van de muis. Als u de muis binnen Canvas beweegt, verandert de achtergrondkleur. Daarnaast wordt de gemiddelde framesnelheid berekend op basis van de huidige verstreken tijd en het totale aantal weergegeven 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

U kunt ontdekken dat uw aangepaste tekening op verschillende snelheden op verschillende computers wordt uitgevoerd. Dit komt doordat uw aangepaste tekening niet onafhankelijk is van framesnelheid. Afhankelijk van het systeem dat u uitvoert en de werkbelasting van dat systeem, kan de Rendering gebeurtenis een ander aantal keren per seconde worden aangeroepen. Zie Graphics Rendering Tiers voor meer informatie over het bepalen van de grafische hardwaremogelijkheden en -prestaties voor een apparaat waarop een WPF-toepassing wordt uitgevoerd.

Het toevoegen of verwijderen van een rendering gedelegeerde EventHandler terwijl de gebeurtenis wordt geactiveerd, wordt uitgesteld totdat de gebeurtenis is voltooid. Dit is consistent met de manier waarop MulticastDelegategebeurtenissen op basis van de Common Language Runtime (CLR) worden verwerkt. Houd er ook rekening mee dat rendering-gebeurtenissen niet gegarandeerd in een bepaalde volgorde worden aangeroepen. Als u meerdere EventHandler gemachtigden hebt die afhankelijk zijn van een bepaalde volgorde, moet u één Rendering gebeurtenis registreren en de gemachtigden zelf in de juiste volgorde schakelen.

Zie ook