Megosztás a következőn keresztül:


Útmutató: Renderelés keretenkénti intervallumon a CompositionTarget használatával

A WPF animációs motor számos funkciót kínál a keretalapú animációk létrehozásához. Vannak azonban olyan alkalmazásforgatókönyvek, amelyekben a képkockánkénti renderelés finomabb szabályozására van szükség. A CompositionTarget objektum lehetőséget nyújt egyedi animációk létrehozására, amelyek keretenként hívhatók vissza.

CompositionTarget egy statikus osztály, amely azt a megjelenítési felületet jelöli, amelyen az alkalmazás rajzolva van. A Rendering esemény minden alkalommal megjelenik, amikor az alkalmazás jelenete megrajzolódik. A képkockasebesség az a szám, amely meghatározza, hogy a jelenet másodpercenként hányszor kerül kirajzolásra.

Megjegyzés:

A CompositionTargethasználatával készült teljes kódmintát a A CompositionTarget-mintacímű témakörben talál.

példa

A Rendering esemény a WPF-renderelési folyamat során aktiválódik. A következő példa bemutatja, hogyan regisztrál egy EventHandler delegáltat a statikus Rendering metódusra a CompositionTarget-n.

// 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

A renderelési eseménykezelő metódussal egyéni rajztartalmakat hozhat létre. Ezt az eseménykezelő metódust a rendszer egyszer keretenként hívja meg. Minden alkalommal, amikor a WPF a vizualizációfán lévő tartós renderelési adatokat a kompozíciós jelenet grafikonja felé mozgatja, a rendszer meghívja az eseménykezelő metódust. Emellett, ha a vizualizációfa módosítása a kompozíciós jelenet grafikonjának frissítését kényszeríti, az eseménykezelő metódust is meghívja a rendszer. Vegye figyelembe, hogy az eseménykezelő metódus az elrendezés kiszámítása után lesz meghívva. Az eseménykezelő metódusban azonban módosíthatja az elrendezést, ami azt jelenti, hogy az elrendezést még egyszer kiszámítja a renderelés előtt.

Az alábbi példa bemutatja, hogyan adhat meg egyéni rajzot egy CompositionTarget eseménykezelő metódusban. Ebben az esetben a Canvas háttérszíne az egér koordináta-pozíciója alapján színértékkel lesz rajzolva. Ha az egeret a Canvasbelülre helyezi, a háttér színe megváltozik. Emellett az átlagos képkockasebesség kiszámítása az aktuális eltelt idő és a renderelt keretek teljes száma alapján történik.

// 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

Előfordulhat, hogy az egyéni rajz különböző sebességgel fut különböző számítógépeken. Ennek az az oka, hogy az egyéni rajz nem független a képkockasebességtől. A futó rendszertől és a rendszer számítási feladatától függően a Rendering esemény másodpercenként eltérő számú alkalommal hívható meg. A WPF-alkalmazást futtató eszközök grafikus hardverképességének és teljesítményének meghatározásáról a Grafikus megjelenítési szintekcímű témakörben olvashat.

A renderelési EventHandler delegált hozzáadása vagy eltávolítása az esemény végrehajtása közben késleltetve lesz, amíg az esemény be nem fejeződik. Ez összhangban van a MulticastDelegate-alapú események a Common Language Runtime (CLR) által történő kezelésével. Azt is vegye figyelembe, hogy a renderelési események nem garantáltan egyetlen adott sorrendben sem hívhatók meg. Ha több EventHandler delegáltja van, amelyek egy bizonyos sorrendre támaszkodnak, akkor egyetlen Rendering eseményt kell regisztrálnia, és magának kell a delegáltakat a megfelelő sorrendben összekapcsolnia.

Lásd még