Megosztás a következőn keresztül:


A teljesítmény optimalizálása: 2D grafika és képalkotás

A WPF 2D grafikus és képalkotó funkciók széles skáláját kínálja, amelyek optimalizálhatók az alkalmazás követelményeinek megfelelően. Ez a témakör a teljesítményoptimalizálással kapcsolatos információkat tartalmaz ezeken a területeken.

Rajz és alakzatok

A WPF Drawing és Shape objektumokat is biztosít a grafikus rajztartalom megjelenítéséhez. Az Drawing objektumok azonban egyszerűbb szerkezetek, mint Shape objektumok, és jobb teljesítményjellemzőket biztosítanak.

A Shape lehetővé teszi, hogy grafikus alakzatokat rajzolj a képernyőre. Mivel az FrameworkElement osztályból származnak, Shape objektumok paneleken és a legtöbb vezérlőn belül használhatók.

A WPF több rétegben biztosít hozzáférést a grafikus és renderelési szolgáltatásokhoz. A felső rétegben Shape objektumok könnyen használhatók, és számos hasznos funkciót biztosítanak, például az elrendezést és az eseménykezelést. A WPF számos használatra kész alakzatobjektumot biztosít. Minden alakzatobjektum öröklődik a Shape osztályból. Az elérhető alakzatobjektumok a következők: Ellipse, Line, Path, Polygon, Polylineés Rectangle.

Drawing objektumok viszont nem a FrameworkElement osztályból származnak, és kisebb súlyú implementációt biztosítanak az alakzatok, képek és szövegek megjelenítéséhez.

A Drawing objektumoknak négy típusa van:

A GeometryDrawing objektum geometriai tartalmak megjelenítésére szolgál. A Geometry osztály és az abból származó konkrét osztályok, például CombinedGeometry, EllipseGeometryés PathGeometry, lehetővé teszik a 2D-s ábrák megjelenítését, valamint a találattesztelést és a kivágási támogatást. Geometriai objektumok használhatók például egy vezérlőelem régiójának meghatározására, vagy a képre alkalmazni kívánt klipterület meghatározására. A geometriai objektumok lehetnek egyszerű régiók, például téglalapok és körök, vagy két vagy több geometriai objektumból létrehozott összetett régiók. Összetettebb geometriai régiók hozhatók létre PathSegment-származtatott objektumok, például ArcSegment, BezierSegmentés QuadraticBezierSegmentkombinálásával.

A felületen a Geometry osztály és a Shape osztály hasonló. Mindkettőt a 2D-s ábrák renderelésére használják, és mindkettőhöz hasonló betonosztályok származnak, például EllipseGeometry és Ellipse. E két osztálycsoport között azonban jelentős különbségek vannak. Az Geometry osztály például nem rendelkezik az Shape osztály bizonyos funkcióival, például a rajzolás lehetőségével. Geometriai objektum rajzolásához a rajzművelet végrehajtásához egy másik osztályt, például a DrawingContextet, a Rajzot vagy az Elérési utat (érdemes megjegyezni, hogy az elérési út alakzat) kell használni. Az olyan renderelési tulajdonságok, mint a kitöltés, a körvonal és a vonás vastagsága a geometriai objektumot rajzoló osztályon vannak, míg egy alakzatobjektum ezeket a tulajdonságokat tartalmazza. Ennek a különbségnek az egyik módja, ha egy geometriai objektum meghatároz egy régiót, például egy kört, míg egy alakzatobjektum meghatároz egy régiót, meghatározza a régió kitöltésének és tagolásának módját, és részt vesz az elrendezési rendszerben.

Mivel Shape objektumok a FrameworkElement osztályból származnak, a használatuk jelentősen több memóriahasználatot adhat az alkalmazáshoz. Ha valóban nincs szüksége a grafikus tartalom FrameworkElement funkcióira, fontolja meg a kisebb súlyú Drawing objektumok használatát.

Az Drawing objektumokról további információt Rajzobjektumok áttekintésecímű témakörben talál.

StreamGeometry-objektumok

A StreamGeometry objektum a geometriai alakzatok létrehozására szolgáló PathGeometry egyszerű alternatívája. Összetett geometria leírásához használjon StreamGeometry. StreamGeometry számos PathGeometry objektum kezelésére van optimalizálva, és jobb teljesítményt nyújt, ha több egyéni PathGeometry objektumot használ.

Az alábbi példa attribútumszintaxissal hoz létre egy háromszög alakú elemet StreamGeometry az XAML kódban.

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

Az StreamGeometry objektumokkal kapcsolatos további információkért lásd: Alakzat létrehozása StreamGeometry-használatával.

Rajzolási vizuális objektumok

A DrawingVisual objektum egy egyszerű rajzosztály, amely alakzatok, képek vagy szövegek megjelenítésére szolgál. Ez az osztály egyszerűnek tekinthető, mert nem biztosít elrendezést vagy eseménykezelést, ami javítja a teljesítményét. Ezért a rajzok ideálisak hátterekhez és ClipArt-elemekhez. További információért lásd a DrawingVisual objektumok használatát: .

Képek

A WPF-képalkotás jelentős előrelépést jelent a Windows korábbi verzióiban elérhető képalkotó képességekhez képest. A képalkotó képességeket, például a bitképek megjelenítését vagy a képek közös vezérlőn való használatát elsősorban a Microsoft Windows Grafikus eszköz felülete (GDI) vagy a Microsoft Windows GDI+ alkalmazásprogramozási felülete (API) kezelte. Ezek az API-k alapszintű képalkotó funkciókat biztosítottak, de nem rendelkeztek olyan funkciókkal, mint a kodekek bővíthetőségének támogatása és a nagy hűségű képek támogatása. A WPF Képalkotó API-kat átterveztük, hogy leküzdjük a GDI és a GDI+ hiányosságait, és új API-kat biztosítsunk az alkalmazásokban lévő képek megjelenítéséhez és használatához.

Képek használatakor fontolja meg a következő javaslatokat a jobb teljesítmény eléréséhez:

  • Ha az alkalmazás miniatűr képek megjelenítését követeli meg, fontolja meg a kép csökkentett méretű verziójának létrehozását. Alapértelmezés szerint a WPF betölti a képet, és teljes méretre dekódolja. Ha csak a kép miniatűr verzióját szeretné használni, a WPF szükségtelenül dekódolja a képet teljes méretre, majd miniatűr méretre skálázza. A szükségtelen többletterhelés elkerülése érdekében kérheti a WPF-et, hogy miniatűr méretre dekódolja a képet, vagy kérje meg a WPF-et, hogy töltsön be egy miniatűr méretű képet.

  • A rendszerképet mindig a kívánt méretre és ne az alapértelmezett méretre dekódolja. A fentieknek megfelelően kérje meg a WPF-et, hogy a rendszerképet ne az alapértelmezett teljes méretre, hanem a kívánt méretre dekódolja. Nemcsak az alkalmazás munkakészletét, hanem a végrehajtási sebességet is csökkenteni fogja.

  • Ha lehetséges, egyesítse a képeket egyetlen képbe, például egy több képből álló filmcsíkba.

  • További információért tekintse meg a Képalkotás áttekintéserészt.

Bitképméretarány-mód

A bitképek méretezésének animálásakor az alapértelmezett kiváló minőségű kép-újramintázó algoritmus néha elegendő rendszererőforrást használhat fel a képkockasebesség romlásához, ami hatékonyan dadogást okoz az animációkban. A BitmapScalingMode objektum RenderOptions tulajdonságának LowQualitybeállításával simább animációt hozhat létre a bitképek skálázásakor. LowQuality mód arra utasítja a WPF-renderelő motort, hogy a képek feldolgozásakor váltson a minőségoptimalizált algoritmusról egy sebességoptimalizált algoritmusra.

Az alábbi példa bemutatja, hogyan állíthatja be a BitmapScalingMode-t egy képobjektumhoz.

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

A WPF alapértelmezés szerint nem gyorsítótárazza TileBrush objektumok renderelt tartalmát, például DrawingBrush és VisualBrush. Olyan statikus helyzetekben, ahol a TileBrush tartalma vagy használata a jelenetben nem változik, ennek van értelme, mivel megőrzi a videomemóriát. Nincs akkora értelme, ha a statikus tartalommal rendelkező TileBrush nem statikus módon használják – például ha egy statikus DrawingBrush vagy VisualBrush egy forgó 3D objektum felületére van leképezve. A WPF alapértelmezett viselkedése a DrawingBrush vagy VisualBrush teljes tartalmának újra renderelése minden képkockához, annak ellenére, hogy a tartalom változatlan.

Ha a CachingHint objektum RenderOptions tulajdonságát Cacheértékre állítja, a csempézett ecsetobjektumok gyorsítótárazott verzióival növelheti a teljesítményt.

A CacheInvalidationThresholdMinimum és CacheInvalidationThresholdMaximum tulajdonságértékek relatív méretértékek, amelyek meghatározzák, hogy mikor kell újra létrehozni az TileBrush objektumot a méretezési változások miatt. Ha például a CacheInvalidationThresholdMaximum tulajdonságot 2.0-ra állítja, a TileBrush gyorsítótárát csak akkor kell újragenerálni, ha mérete meghaladja az aktuális gyorsítótár méretének kétszeresét.

Az alábbi példa bemutatja, hogyan használható a gyorsítótárazási javaslat opció egy DrawingBrushesetén.

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)

Lásd még