Bagikan melalui


Cara: Merender pada Interval Per Bingkai Menggunakan CompositionTarget

Mesin animasi WPF menyediakan banyak fitur untuk membuat animasi berbasis bingkai. Namun, ada skenario aplikasi di mana Anda membutuhkan kontrol yang lebih halus atas penyajian per bingkai. Objek CompositionTarget menyediakan kemampuan untuk membuat animasi kustom berdasarkan panggilan balik per bingkai.

CompositionTarget adalah kelas statis yang mewakili permukaan tampilan tempat aplikasi Anda digambar. Peristiwa Rendering dipicu setiap kali adegan pada aplikasi digambar. Kecepatan bingkai penyajian adalah berapa kali adegan digambar per detik.

Nota

Untuk contoh kode lengkap yang menggunakan CompositionTarget, lihat Sampel Penggunaan CompositionTarget.

Contoh

Peristiwa Rendering diaktifkan selama proses penyajian WPF. Contoh berikut menunjukkan cara Anda mendaftarkan delegasi EventHandler ke metode Rendering statis pada 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

Anda dapat menggunakan metode penanganan aktivitas penyajian untuk membuat konten gambar kustom. Metode penanganan peristiwa ini dipanggil sekali per frame. Setiap kali WPF mengelola data penyajian yang disimpan di pohon visual ke graf adegan komposisi, metode penangan kejadian Anda dipanggil. Selain itu, jika perubahan pada pohon visual memaksa pembaruan pada grafik adegan komposisi, metode penanganan aktivitas Anda juga dipanggil. Perhatikan bahwa metode penanganan event Anda dipanggil setelah tata letak dihitung. Namun, Anda dapat memodifikasi tata letak dalam metode penanganan aktivitas, yang berarti tata letak tersebut akan dihitung sekali lagi sebelum penyajian.

Contoh berikut menunjukkan bagaimana Anda dapat memberikan gambar kustom dalam metode penanganan aktivitas CompositionTarget. Dalam hal ini, warna latar belakang Canvas digambar dengan nilai warna berdasarkan posisi koordinat mouse. Jika Anda memindahkan mouse di dalam Canvas, warna latar belakangnya berubah. Selain itu, frame rate rata-rata dihitung berdasarkan waktu yang telah berlalu dan jumlah total bingkai yang dirender.

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

Anda mungkin menemukan bahwa gambar kustom Anda berjalan pada kecepatan yang berbeda pada komputer yang berbeda. Ini karena gambar kustom Anda tidak independen terhadap kecepatan bingkai. Tergantung pada sistem yang Anda jalankan dan beban kerja sistem tersebut, peristiwa Rendering dapat dipanggil dengan frekuensi yang berbeda per detik. Untuk informasi tentang menentukan kemampuan dan performa perangkat keras grafis untuk perangkat yang menjalankan aplikasi WPF, lihat Tingkat Rendering Grafis.

Menambahkan atau menghapus delegasi EventHandler penyajian saat peristiwa diaktifkan akan tertunda hingga setelah peristiwa selesai diaktifkan. Ini konsisten dengan bagaimana peristiwa berbasis MulticastDelegateditangani dalam Common Language Runtime (CLR). Perhatikan juga bahwa peristiwa penyajian tidak dijamin akan dipanggil dalam urutan tertentu. Jika Anda memiliki beberapa delegasi EventHandler yang mengandalkan urutan tertentu, Anda harus mendaftarkan satu event Rendering dan mengatur delegasi tersebut dalam urutan yang benar secara mandiri.

Lihat juga