Aracılığıyla paylaş


Performansı İyi hale getirme: 2B Grafikler ve Görüntüleme

WPF, uygulama gereksinimleriniz için iyileştirilebilen çok çeşitli 2B grafikler ve görüntüleme işlevleri sağlar. Bu konu, bu alanlardaki performans iyileştirme hakkında bilgi sağlar.

Çizim ve Şekiller

WPF, grafik çizim içeriğini göstermek için hem Drawing hem de Shape nesneleri sağlar. Ancak, Drawing nesneler Shape nesnelerden daha basit yapılardır ve daha iyi performans özellikleri sağlar.

Shape, ekrana grafik bir şekil çizmenizi sağlar. bunlar FrameworkElement sınıfından türetildiğinden, Shape nesneler paneller ve çoğu denetim içinde kullanılabilir.

WPF, grafiklere ve işleme hizmetlerine çeşitli erişim katmanları sunar. Üst katmanda, Shape nesneleri kullanımı kolaydır ve düzen ve olay işleme gibi birçok kullanışlı özellik sağlar. WPF bir dizi kullanıma hazır şekil nesnesi sağlar. Tüm şekil nesneleri Shape sınıfından devralır. Kullanılabilir şekil nesneleri Ellipse, Line, Path, Polygon, Polylineve Rectangleiçerir.

Öte yandan nesneleri Drawing, FrameworkElement sınıfından türetmez ve şekilleri, resimleri ve metinleri işlemek için daha hafif bir uygulama sağlar.

Dört tür Drawing nesnesi vardır:

GeometryDrawing nesnesi geometri içeriğini işlemek için kullanılır. Geometry sınıfı ve CombinedGeometry, EllipseGeometryve PathGeometrygibi ondan türetilen somut sınıflar, 2B grafikleri işlemek ve isabet testi ve kırpma desteği sağlamak için bir yol sağlar. Geometri nesneleri, örneğin bir denetimin bölgesini tanımlamak veya bir görüntüye uygulanacak kesme bölgesini tanımlamak için kullanılabilir. Geometri nesneleri dikdörtgenler ve daireler gibi basit bölgeler veya iki veya daha fazla geometri nesnesinden oluşturulan bileşik bölgeler olabilir. PathSegment, ArcSegmentve BezierSegmentgibi QuadraticBezierSegmenttüretilmiş nesneler birleştirilerek daha karmaşık geometrik bölgeler oluşturulabilir.

Yüzeyde, Geometry sınıfı ve Shape sınıfı benzerdir. Her ikisi de 2B grafiklerin işlenmesinde kullanılır ve her ikisi de bunlardan türetilen benzer somut sınıflara sahiptir, örneğin, EllipseGeometry ve Ellipse. Ancak, bu iki sınıf kümesi arasında önemli farklar vardır. İlk olarak, Geometry sınıfı, kendisini çizme yeteneği gibi Shape sınıfının bazı işlevlerine sahip değildir. Geometri nesnesi çizmek için, başka bir sınıf olan DrawingContext, Drawing veya Path (Path'in bir Şekil olduğunu belirtmekte fayda var) kullanılmalıdır. Dolgu, vuruş ve vuruş kalınlığı gibi işleme özellikleri geometri nesnesini çizen sınıfta yer alırken, şekil nesnesi bu özellikleri içerir. Bu farkı düşünmenin bir yolu, geometri nesnesinin bir bölgeyi, örneğin bir daireyi tanımlaması, şekil nesnesinin bir bölgeyi tanımlaması, bu bölgenin nasıl doldurulduğunu ve ana hatlarını belirlemesi ve düzen sistemine katılmasıdır.

Shape nesneleri FrameworkElement sınıfından türediğinden, bunları kullanmak uygulamanıza önemli ölçüde daha fazla bellek tüketimi ekleyebilir. Grafik içeriğiniz için FrameworkElement özelliklerine gerçekten ihtiyacınız yoksa, daha hafif Drawing nesneleri kullanmayı göz önünde bulundurun.

Drawing nesneler hakkında daha fazla bilgi için bkz. Çizim Nesnelerine Genel Bakış.

StreamGeometry Nesneleri

StreamGeometry nesnesi, geometrik şekiller oluşturmak için PathGeometry basit bir alternatiftir. Karmaşık bir geometriyi tanımlamanız gerektiğinde bir StreamGeometry kullanın. StreamGeometry, birçok PathGeometry nesnesini işlemek için iyileştirilmiştir ve birçok tek tek PathGeometry nesnesi kullanımına kıyasla daha iyi performans gösterir.

Aşağıdaki örnek, XAML'de üçgen StreamGeometry oluşturmak için öznitelik söz dizimini kullanır.

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

StreamGeometry nesneleri hakkında daha fazla bilgi için bkz. StreamGeometryKullanarak Şekil Oluşturma.

DrawingVisual nesneleri

DrawingVisual nesnesi, şekilleri, resimleri veya metinleri işlemek için kullanılan basit bir çizim sınıfıdır. Bu sınıf, düzen veya olay işleme sağlamadığından hafif kabul edilir ve bu da performansını artırır. Bu nedenle çizimler arka planlar ve küçük resimler için idealdir. Daha fazla bilgi için bkz. DrawingVisual Nesnelerini Kullanma.

Resimler

WPF görüntüleme, Windows'un önceki sürümlerindeki görüntüleme özellikleri üzerinde önemli bir geliştirme sağlar. Bit eşlem görüntüleme veya ortak denetimde görüntü kullanma gibi görüntüleme özellikleri öncelikli olarak Microsoft Windows Grafik Cihaz Arabirimi (GDI) veya Microsoft Windows GDI+ uygulama programlama arabirimi (API) tarafından işlenir. Bu API'ler temel görüntüleme işlevselliği sağlasa da codec genişletilebilirliği desteği ve yüksek aslına uygunluk görüntü desteği gibi özelliklere sahip değil. WPF Görüntüleme API'leri, GDI ve GDI+ eksikliklerinin üstesinden gelmek ve uygulamalarınızda görüntüleri görüntülemek ve kullanmak için yeni bir API kümesi sağlamak için yeniden tasarlanmıştır.

Görüntüleri kullanırken daha iyi performans elde etmek için aşağıdaki önerileri göz önünde bulundurun:

  • Uygulamanız küçük resim görüntülerini görüntülemenizi gerektiriyorsa, resmin küçültülmüş boyutlu bir sürümünü oluşturmayı göz önünde bulundurun. Varsayılan olarak WPF görüntünüzü yükler ve tam boyutuna çözer. Görüntünün yalnızca küçük resim sürümünü istiyorsanız, WPF gereksiz şekilde resmin kodunu tam boyutuna çözer ve sonra küçük resim boyutuna ölçeklendirir. Bu gereksiz ek yükü önlemek için WPF'nin görüntünün kodunu küçük resim boyutuna çözmesini isteyebilir veya WPF'nin küçük resim boyutu görüntüsünü yüklemesini isteyebilirsiniz.

  • Görüntüyü her zaman varsayılan boyuta değil, istediğiniz boyuta deşifre edin. Yukarıda belirtildiği gibi WPF'den görüntünüzün kodunu varsayılan tam boyuta değil istenen boyuta çözmesini isteyin. Yalnızca uygulamanızın çalışma kümesini değil yürütme hızını da azaltacaksınız.

  • Mümkünse, görüntüleri birden çok görüntüden oluşan bir film şeridi gibi tek bir görüntüde birleştirin.

  • Daha fazla bilgi için bkz. Görüntülemeye Genel Bakış.

Bitmap Ölçekleme Modu

Herhangi bir bit eşlem ölçeğini canlandırırken, varsayılan yüksek kaliteli görüntü yeniden örnekleme algoritması bazen kare hızının düşmesine neden olmak için yeterli sistem kaynaklarını tüketerek animasyonların etkili bir şekilde takılmasına neden olabilir. BitmapScalingMode nesnesinin RenderOptions özelliğini LowQualityolarak ayarlayarak, bit eşlem ölçeklendirirken daha yumuşak bir animasyon oluşturabilirsiniz. LowQuality modu WPF işleme altyapısına görüntüleri işlerken kalite için iyileştirilmiş bir algoritmadan hız için iyileştirilmiş bir algoritmaya geçiş yapmalarını söyler.

Aşağıdaki örnekte, bir görüntü nesnesi için BitmapScalingMode nasıl ayarlanacağı gösterilmektedir.

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

Varsayılan olarak WPF, TileBrush ve DrawingBrushgibi VisualBrush nesnelerinin işlenmiş içeriğini önbelleğe almaz. Sahnedeki TileBrush içeriğinin veya kullanımının değişmediği statik senaryolarda, video belleğinden tasarruf ettiğinden bu mantıklıdır. Statik içeriğe sahip bir TileBrush statik olmayan bir şekilde kullanıldığında (örneğin, statik bir DrawingBrush veya VisualBrush dönen bir 3B nesnenin yüzeyine eşlendiğinde) çok anlamlı değildir. WPF'nin varsayılan davranışı, içerik değişmese bile her çerçeve için DrawingBrush veya VisualBrush içeriğinin tamamını yeniden işlemektir.

CachingHint nesnesinin RenderOptions özelliğini Cacheolarak ayarlayarak, kutucuklu fırça nesnelerinin önbelleğe alınmış sürümlerini kullanarak performansı artırabilirsiniz.

CacheInvalidationThresholdMinimum ve CacheInvalidationThresholdMaximum özellik değerleri, ölçek değişiklikleri nedeniyle TileBrush nesnesinin ne zaman yeniden oluşturulacaklarını belirleyen göreli boyut değerleridir. Örneğin, CacheInvalidationThresholdMaximum özelliğini 2.0 olarak ayarlayarak, TileBrush önbelleğinin yalnızca boyutu geçerli önbelleğin boyutunun iki katını aştığında yeniden oluşturulmalıdır.

Aşağıdaki örnekte, DrawingBrushiçin önbelleğe alma ipucu seçeneğinin nasıl kullanılacağı gösterilmektedir.

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)

Ayrıca bakınız