Bagikan melalui


Mengoptimalkan Performa: Grafik dan Pencitraan 2D

WPF menyediakan berbagai fungsionalitas grafis dan pencitraan 2D yang dapat dioptimalkan untuk kebutuhan aplikasi Anda. Topik ini menyediakan informasi tentang pengoptimalan performa di area tersebut.

Gambar dan Bentuk

WPF menyediakan objek Drawing dan Shape untuk mewakili konten gambar grafis. Namun, objek Drawing adalah konstruksi yang lebih sederhana daripada objek Shape dan memberikan karakteristik performa yang lebih baik.

Shape memungkinkan Anda menggambar bentuk grafis ke layar. Karena berasal dari kelas FrameworkElement, objek Shape dapat digunakan di dalam panel dan sebagian besar kontrol.

WPF menawarkan beberapa lapisan akses ke layanan grafis dan penyajian. Di lapisan atas, objek Shape mudah digunakan dan menyediakan banyak fitur yang berguna, seperti tata letak dan penanganan peristiwa. WPF menyediakan sejumlah objek bentuk siap pakai. Semua objek bentuk mewarisi dari kelas Shape. Objek bentuk yang tersedia termasuk Ellipse, Line, Path, Polygon, Polyline, dan Rectangle.

Drawing objek, di sisi lain, tidak berasal dari kelas FrameworkElement dan memberikan implementasi yang lebih ringan untuk merender bentuk, gambar, dan teks.

Ada empat jenis objek Drawing:

Objek GeometryDrawing digunakan untuk merender konten geometri. Kelas Geometry dan kelas konkret yang berasal darinya, seperti CombinedGeometry, EllipseGeometry, dan PathGeometry, menyediakan sarana untuk merender grafik 2D dan menyediakan dukungan uji hit dan kliping. Objek geometri dapat digunakan untuk menentukan wilayah kontrol, misalnya, atau untuk menentukan wilayah klip yang akan diterapkan ke gambar. Objek geometri bisa menjadi wilayah sederhana, seperti persegi panjang dan lingkaran, atau wilayah komposit yang dibuat dari dua objek geometri atau lebih. Wilayah geometris yang lebih kompleks dapat dibuat dengan menggabungkan objek turunan PathSegment, seperti ArcSegment, BezierSegment, dan QuadraticBezierSegment.

Di permukaan, kelas Geometry dan kelas Shape serupa. Keduanya digunakan dalam penyajian grafis 2D dan keduanya memiliki kelas beton serupa yang berasal dari mereka, misalnya, EllipseGeometry dan Ellipse. Namun, ada perbedaan penting antara kedua set kelas ini. Untuk satu, kelas Geometry tidak memiliki beberapa fungsionalitas kelas Shape, seperti kemampuan untuk menggambar dirinya sendiri. Untuk menggambar objek geometri, kelas lain seperti DrawingContext, Drawing, atau Path (perlu dicatat bahwa Jalur adalah Bentuk) harus digunakan untuk melakukan operasi menggambar. Properti penyajian seperti pengisian, goresan, dan ketebalan goresan ada di kelas yang bertugas menggambar objek geometri, sedangkan objek bentuk menyimpan properti tersebut. Salah satu cara untuk memikirkan perbedaan ini adalah bahwa objek geometri mendefinisikan wilayah, misalnya, lingkaran, sementara objek bentuk mendefinisikan wilayah, menentukan bagaimana wilayah tersebut diisi dan diuraikan, dan berpartisipasi dalam sistem tata letak.

Karena objek Shape berasal dari kelas FrameworkElement, menggunakannya dapat menambahkan lebih banyak konsumsi memori secara signifikan dalam aplikasi Anda. Jika Anda benar-benar tidak memerlukan fitur FrameworkElement untuk konten grafis Anda, pertimbangkan untuk menggunakan objek Drawing yang lebih ringan.

Untuk informasi selengkapnya tentang objek Drawing, lihat Gambaran Umum Objek Gambar .

Objek StreamGeometry

Objek StreamGeometry adalah alternatif ringan untuk PathGeometry untuk membuat bentuk geometris. Gunakan StreamGeometry saat Anda perlu menggambarkan geometri yang kompleks. StreamGeometry dioptimalkan untuk menangani banyak objek PathGeometry dan berkinerja lebih baik jika dibandingkan dengan menggunakan banyak objek PathGeometry individu.

Berikut adalah contoh yang menggunakan sintaks atribut untuk membuat segitiga dengan StreamGeometry di XAML.

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <StackPanel>
  
    <Path Data="F0 M10,100 L100,100 100,50Z" 
      StrokeThickness="1" Stroke="Black"/>

  </StackPanel>
</Page>

Untuk informasi selengkapnya tentang objek StreamGeometry, lihat Membuat Bentuk Menggunakan StreamGeometry.

Objek DrawingVisual

Objek DrawingVisual adalah kelas gambar ringan yang digunakan untuk merender bentuk, gambar, atau teks. Kelas ini dianggap ringan karena tidak menyediakan pengaturan tata letak atau penanganan acara, sehingga meningkatkan performanya. Untuk alasan ini, gambar sangat ideal untuk latar belakang dan clip art. Untuk informasi selengkapnya, lihat Menggunakan Objek DrawingVisual.

Gambar

Pencitraan WPF memberikan peningkatan signifikan atas kemampuan pencitraan di versi Windows sebelumnya. Kemampuan pencitraan, seperti menampilkan bitmap atau menggunakan gambar pada kontrol umum, terutama ditangani oleh antarmuka pemrograman aplikasi (API) Microsoft Windows Graphics Device Interface (GDI) atau Microsoft Windows GDI+. API ini menyediakan fungsionalitas pencitraan garis besar tetapi tidak memiliki fitur seperti dukungan untuk ekstensibilitas codec dan dukungan gambar keakuratan tinggi. API Pencitraan WPF telah dirancang ulang untuk mengatasi kekurangan GDI dan GDI+ dan menyediakan sekumpulan API baru untuk menampilkan dan menggunakan gambar dalam aplikasi Anda.

Saat menggunakan gambar, pertimbangkan rekomendasi berikut untuk mendapatkan performa yang lebih baik:

  • Jika aplikasi mengharuskan Anda menampilkan gambar mini, pertimbangkan untuk membuat versi gambar yang ukurannya diperkecil. Secara default, WPF memuat gambar Anda dan mendekodenya ke ukuran penuhnya. Jika Anda hanya menginginkan versi gambar mini dari gambar tersebut, WPF secara tidak perlu mendekode gambar ke ukuran penuhnya lalu mengubah skalanya menjadi ukuran gambar mini. Untuk menghindari overhead yang tidak perlu ini, Anda dapat meminta WPF untuk mendekode gambar ke ukuran gambar mini, atau meminta WPF untuk memuat gambar mini.

  • Selalu dekode gambar ke ukuran yang diinginkan dan bukan ke ukuran default. Seperti disebutkan di atas, minta WPF untuk mendekode gambar Anda ke ukuran yang diinginkan dan bukan ukuran penuh default. Anda tidak hanya akan mengurangi set kerja aplikasi Anda, tetapi juga kecepatan eksekusi.

  • Jika memungkinkan, gabungkan gambar ke dalam satu gambar, seperti strip film yang terdiri dari beberapa gambar.

  • Untuk informasi selengkapnya, lihat Gambaran Umum Pencitraan .

BitmapScalingMode (Mode Pembesaran Bitmap)

Saat menganimasikan skala bitmap apa pun, algoritma pengambilan sampel gambar berkualitas tinggi default terkadang dapat menggunakan cukup banyak sumber daya sistem untuk menyebabkan penurunan pada kecepatan bingkai, sehingga animasi tersendat. Dengan mengatur properti BitmapScalingMode objek RenderOptions ke LowQuality, Anda dapat membuat animasi yang lebih halus saat menskalakan bitmap. mode LowQuality memberi tahu mesin penyajian WPF untuk beralih dari algoritma yang dioptimalkan kualitas ke algoritma yang dioptimalkan kecepatan saat memproses gambar.

Contoh berikut menunjukkan cara mengatur BitmapScalingMode untuk objek gambar.

// Set the bitmap scaling mode for the image to render faster.
RenderOptions.SetBitmapScalingMode(MyImage, BitmapScalingMode.LowQuality);
' Set the bitmap scaling mode for the image to render faster.
RenderOptions.SetBitmapScalingMode(MyImage, BitmapScalingMode.LowQuality)

CachingHint

Secara default, WPF tidak menyimpan cache konten objek TileBrush yang dirender, seperti DrawingBrush dan VisualBrush. Dalam skenario statis di mana konten atau penggunaan TileBrush dalam adegan tidak berubah, ini masuk akal, karena menghemat memori video. Ini tidak masuk akal ketika TileBrush dengan konten statis digunakan dengan cara non-statis—misalnya, ketika DrawingBrush statis atau VisualBrush dipetakan ke permukaan objek 3D yang berputar. Perilaku default WPF adalah merender ulang seluruh konten DrawingBrush atau VisualBrush untuk setiap bingkai, meskipun kontennya tidak berubah.

Dengan mengatur properti CachingHint dari objek RenderOptions menjadi Cache, Anda dapat meningkatkan performa dengan menggunakan versi cache dari objek kuas berpola ubin.

Nilai properti CacheInvalidationThresholdMinimum dan CacheInvalidationThresholdMaximum adalah nilai ukuran relatif yang menentukan kapan objek TileBrush harus diregenerasi karena perubahan skala. Misalnya, dengan mengatur properti CacheInvalidationThresholdMaximum ke 2.0, cache untuk TileBrush hanya perlu diregenerasi ketika ukurannya melebihi dua kali ukuran cache saat ini.

Contoh berikut menunjukkan cara menggunakan opsi petunjuk penyimpanan sementara untuk DrawingBrush.

DrawingBrush drawingBrush = new DrawingBrush();

// Set the caching hint option for the brush.
RenderOptions.SetCachingHint(drawingBrush, CachingHint.Cache);

// Set the minimum and maximum relative sizes for regenerating the tiled brush.
// The tiled brush will be regenerated and re-cached when its size is
// 0.5x or 2x of the current cached size.
RenderOptions.SetCacheInvalidationThresholdMinimum(drawingBrush, 0.5);
RenderOptions.SetCacheInvalidationThresholdMaximum(drawingBrush, 2.0);
Dim drawingBrush As New DrawingBrush()

' Set the caching hint option for the brush.
RenderOptions.SetCachingHint(drawingBrush, CachingHint.Cache)

' Set the minimum and maximum relative sizes for regenerating the tiled brush.
' The tiled brush will be regenerated and re-cached when its size is
' 0.5x or 2x of the current cached size.
RenderOptions.SetCacheInvalidationThresholdMinimum(drawingBrush, 0.5)
RenderOptions.SetCacheInvalidationThresholdMaximum(drawingBrush, 2.0)

Lihat juga