Optimalizace výkonu: 2D grafika a obrázky
WPF poskytuje širokou škálu 2D grafických a imagingových funkcí, které je možné optimalizovat pro požadavky vaší aplikace. Toto téma obsahuje informace o optimalizaci výkonu v těchto oblastech.
Kreslení a obrazce
WPF poskytuje jak DrawingShape objekty, tak i objekty, které představují grafický obsah výkresu. Drawing Objekty jsou však jednodušší konstrukce než Shape objekty a poskytují lepší charakteristiky výkonu.
A Shape umožňuje nakreslit grafický obrazec na obrazovku. Vzhledem k tomu, že jsou odvozeny z FrameworkElement třídy, Shape lze objekty použít uvnitř panelů a většina ovládacích prvků.
WPF nabízí několik vrstev přístupu k grafickým a vykreslovacím službám. V horní vrstvě Shape jsou objekty snadno použitelné a poskytují mnoho užitečných funkcí, jako je rozložení a zpracování událostí. WPF poskytuje řadu objektů obrazců připravených k použití. Všechny objekty obrazce dědí z Shape třídy. Mezi dostupné objekty obrazce patří Ellipse, , LinePath, Polygon, Polyline, a Rectangle.
Drawing na druhé straně neodvozují z FrameworkElement třídy a poskytují světlejší implementaci pro vykreslování obrazců, obrázků a textu.
Existují čtyři typy Drawing objektů:
GeometryDrawing Nakreslí obrazec.
ImageDrawing Nakreslí obrázek.
GlyphRunDrawing Nakreslí text.
DrawingGroup Nakreslí další kresby. Pomocí skupiny výkresů můžete zkombinovat jiné výkresy do jednoho složeného výkresu.
Objekt GeometryDrawing se používá k vykreslení obsahu geometrie. Třída Geometry a konkrétní třídy, které jsou z ní odvozeny, například CombinedGeometry, EllipseGeometrya PathGeometryposkytují prostředky pro vykreslování 2D grafiky a poskytování podpory testování hit-testování a výřezu. Objekty geometrie lze použít k definování oblasti ovládacího prvku, například nebo k definování oblasti klipu, která se má použít na obrázek. Objekty geometrie můžou být jednoduché oblasti, jako jsou obdélníky a kruhy nebo složené oblasti vytvořené ze dvou nebo více objektů geometrie. Složitější geometrické oblasti lze vytvořit kombinací PathSegment-odvozených objektů, jako ArcSegmentje , BezierSegmenta QuadraticBezierSegment.
Na povrchu Geometry jsou třídy a Shape třídy podobné. Oba se používají při vykreslování 2D grafiky a oba mají podobné konkrétní třídy, které jsou odvozeny od nich, EllipseGeometry například a Ellipse. Mezi těmito dvěma sadami tříd však existují důležité rozdíly. V jedné Geometry třídě chybí některé funkce Shape třídy, jako je například schopnost kreslit sám sebe. Chcete-li nakreslit objekt geometrie, jinou třídu, jako je DrawingContext, Drawing nebo Cesta (stojí za zmínku, že Cesta je obrazec) musí být použita k provedení operace kreslení. Vlastnosti vykreslování, jako je výplň, tah a tloušťka tahu, jsou ve třídě, která nakreslí objekt geometrie, zatímco objekt obrazce tyto vlastnosti obsahuje. Jedním ze způsobů, jak si tento rozdíl představit, je, že objekt geometrie definuje oblast, například kruh, zatímco objekt obrazce definuje oblast, definuje, jak je tato oblast vyplněná a nastíněná, a účastní se systému rozložení.
Vzhledem k tomu, že Shape objekty jsou odvozeny z FrameworkElement třídy, jejich použití může v aplikaci výrazně více spotřebovat paměť. Pokud ve skutečnosti nepotřebujete funkce grafického FrameworkElement obsahu, zvažte použití světlejších Drawing objektů.
Další informace o Drawing objektech naleznete v tématu Přehled nakreslených objektů.
Objekty StreamGeometry
Objekt StreamGeometry je jednoduchá alternativa k PathGeometry vytváření geometrických obrazců. StreamGeometry Použijte, když potřebujete popsat složitou geometrii. StreamGeometry je optimalizovaná pro zpracování mnoha PathGeometry objektů a funguje lépe v porovnání s použitím mnoha jednotlivých PathGeometry objektů.
Následující příklad používá syntaxi atributu k vytvoření trojúhelníku StreamGeometry v 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>
Další informace o StreamGeometry objektech naleznete v tématu Vytvoření obrazce pomocí StreamGeometry.
DrawingVisual – objekty
Objekt DrawingVisual je jednoduchá třída kreslení, která se používá k vykreslení obrazců, obrázků nebo textu. Tato třída je považována za jednoduchou, protože neposkytuje rozložení ani zpracování událostí, což zlepšuje výkon. Z tohoto důvodu jsou kresby ideální pro pozadí a kliparty. Další informace naleznete v tématu Použití objektů DrawingVisual.
Obrázky
Image WPF přináší významné vylepšení možností vytváření imitací v předchozích verzích Windows. Možnosti vytváření obrázků, jako je například zobrazení rastrového obrázku nebo použití obrázku na společném ovládacím prvku, byly primárně zpracovávány rozhraním API (Microsoft Windows Graphics Device Interface) nebo rozhraním API (Microsoft Windows GDI+). Tato rozhraní API poskytují základní funkce pro vytváření obrázků, ale chybí jim funkce, jako je podpora rozšiřitelnosti kodeků a podpora obrázků s vysokou věrností. Rozhraní WPF Imaging API byla přepracována tak, aby překončila nedostatky rozhraní GDI a GDI+ a poskytovala novou sadu rozhraní API pro zobrazování a používání obrázků v aplikacích.
Při používání imagí zvažte následující doporučení pro získání lepšího výkonu:
Pokud vaše aplikace vyžaduje zobrazení miniatur obrázků, zvažte vytvoření zmenšené verze obrázku. WpF ve výchozím nastavení načte vaši image a dekóduje ji na plnou velikost. Pokud chcete jenom verzi miniatury obrázku, wpf nepotřebné dekóduje obrázek na jeho plnou velikost a pak ho škáluje na velikost miniatury. Abyste se vyhnuli zbytečným režijním nákladům, můžete buď požádat WPF o dekódování obrázku na velikost miniatury, nebo požádat WPF o načtení obrázku velikosti miniatury.
Vždy dekódujte obrázek na požadovanou velikost a ne na výchozí velikost. Jak je uvedeno výše, požádejte WPF o dekódování obrázku na požadovanou velikost, a ne na výchozí úplnou velikost. Snížíte nejen pracovní sadu aplikace, ale také rychlost provádění.
Pokud je to možné, zkombinujte obrázky do jednoho obrázku, jako je například filmový pruh složený z více obrázků.
Další informace najdete v přehledu práce s obrázky.
BitmapScalingMode
Při animaci měřítka libovolného rastrového obrázku může výchozí vysoce kvalitní algoritmus převzorkování obrázků někdy spotřebovávat dostatečné systémové prostředky, aby způsobil snížení frekvence snímků, což efektivně způsobuje zadržování animací. BitmapScalingMode Nastavením vlastnosti objektu RenderOptionsLowQualityna můžete při změně měřítka rastrového obrázku vytvořit plynulejší animaci. LowQuality režim říká vykreslovacímu modulu WPF, aby při zpracování obrázků přepnul z algoritmu optimalizovaného pro kvalitu na algoritmus optimalizovaný rychlostí.
Následující příklad ukazuje, jak nastavit BitmapScalingMode objekt obrázku.
// 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)
Ukládání do mezipaměti Hint
WpF ve výchozím nastavení neukládá vykreslený obsah TileBrush objektů do mezipaměti, například DrawingBrush a VisualBrush. Ve statických scénářích, kdy se obsah nebo použití TileBrush scény nemění, to dává smysl, protože šetří paměť videa. Nedává to tolik smysl, když TileBrush se statický obsah používá nestatický způsobem – například když je statický DrawingBrush nebo VisualBrush mapován na povrch otočného 3D objektu. Výchozím chováním WPF je překreslit celý obsah DrawingBrush nebo VisualBrush pro každý rámec, i když se obsah nemění.
CachingHint Nastavením vlastnosti objektu RenderOptionsCachena , můžete zvýšit výkon pomocí verzí mezipaměti dlaždicové štětce objekty.
Hodnoty CacheInvalidationThresholdMinimum vlastností CacheInvalidationThresholdMaximum jsou relativními hodnotami velikosti, které určují, kdy TileBrush se má objekt znovu vygenerovat kvůli změnám měřítka. Například nastavením CacheInvalidationThresholdMaximum vlastnosti na hodnotu 2,0 je třeba znovu vygenerovat mezipaměť TileBrush pouze v případě, že jeho velikost překročí dvojnásobek velikosti aktuální mezipaměti.
Následující příklad ukazuje, jak použít možnost nápovědy pro ukládání do mezipaměti pro .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)
Viz také
.NET Desktop feedback