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, Drawing objek adalah konstruksi yang lebih sederhana daripada Shape objek dan memberikan karakteristik performa yang lebih baik.

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

WPF menawarkan beberapa lapisan akses ke layanan grafis dan penyajian. Di lapisan atas, Shape objek 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 Shape kelas . Objek bentuk yang tersedia meliputi Ellipse, Line, Path, Polygon, Polyline, dan Rectangle.

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

Ada empat jenis Drawing objek:

Objek GeometryDrawing digunakan untuk merender konten geometri. Kelas Geometry dan kelas konkret yang berasal darinya, seperti CombinedGeometry, , EllipseGeometrydan PathGeometry, menyediakan sarana untuk merender grafis 2D dan menyediakan dukungan pengujian 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 PathSegmentobjek -turunan, seperti ArcSegment, , BezierSegmentdan QuadraticBezierSegment.

Di permukaan, Geometry kelas dan Shape kelasnya 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, Geometry kelas tidak memiliki beberapa fungsionalitas Shape kelas, 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 isian, goresan, dan ketebalan goresan ada di kelas yang menggambar objek geometri, sementara objek bentuk berisi properti ini. 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 Shape objek berasal dari FrameworkElement kelas , menggunakannya dapat menambahkan lebih banyak konsumsi memori secara signifikan dalam aplikasi Anda. Jika Anda benar-benar tidak memerlukan FrameworkElement fitur untuk konten grafis Anda, pertimbangkan untuk menggunakan objek yang Drawing lebih ringan.

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

Objek StreamGeometry

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

Contoh berikut menggunakan sintaks atribut untuk membuat segitiga 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 StreamGeometry objek, 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 tata letak atau penanganan peristiwa, yang 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 berukuran berkurang. Secara default, WPF memuat gambar Anda dan mendekodenya ke ukuran penuhnya. Jika Anda hanya menginginkan versi gambar mini gambar, WPF tidak perlu mendekode gambar ke ukuran penuhnya lalu menurunkan skalanya ke 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

Saat menganimasikan skala bitmap apa pun, algoritma pengambilan sampel gambar berkualitas tinggi default terkadang dapat mengonsumsi sumber daya sistem yang memadai untuk menyebabkan penurunan kecepatan bingkai, secara efektif menyebabkan animasi gagap. Dengan mengatur BitmapScalingMode properti RenderOptions objek ke LowQuality, Anda dapat membuat animasi yang lebih halus saat menskalakan bitmap. LowQuality mode 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 TileBrush objek 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 statis DrawingBrush 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 CachingHint properti RenderOptions objek ke Cache, Anda dapat meningkatkan performa dengan menggunakan versi cache objek sikat ubin.

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

Contoh berikut menunjukkan cara menggunakan opsi petunjuk penembolokan 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)

Baca juga