Výběr rozlišení ovládacích prvků

Tento článek vysvětluje, jak nakonfigurovat rozlišení používané ovládacími prvky XAML Win2D. Vysvětluje, jak:

  • Nastavte, aby ovládací prvky Win2D běžely v pevném rozlišení.
  • Upravte rozlišení DPI ovládacího prvku, aby se zlepšil výkon vykreslením menšího počtu pixelů.

Rozlišení a určení velikosti ovládacího prvku

"Rozlišení", jak se používá v tomto dokumentu, je dalším slovem pro velikost rastrového obrázku. Skládá se z šířky a výšky.

Objekty, které ovládací prvky XAML Win2D vykreslují, mají rozlišení. Mají také DPI. DPI objektu je měřením toho, jak hustě jsou pixely daného objektu při vykreslení. DPI se chová jako měřítko – vysoký DPI zvyšuje počet pixelů, které tvoří nakreslený objekt. Na druhou stranu snížení DPI objektu znamená, že bude přesahovat méně pixelů. Další informace o tom, jak Win2D obecně zpracovává DPI, naleznete na této stránce .

Velikost nezávislá na DPI se někdy označuje jako "logická velikost". A velikost závislá na DPI v pixelech se nazývá "fyzická velikost".

Z hlediska rozlišení a velikosti je výchozí chování ovládacího prvku při jeho načtení:

  • Logická velikost ovládacího prvku je určena rozložením podle toho, kam spadá do stromu XAML.
  • Z prostředí se dotazuje DPI. Hodnota DPI ovládacího prvku je nastavená na tuto hodnotu.
  • Velikost fyzických pixelů, které tvoří kreslitelnou oblast ovládacího prvku, je určena velikostí ovládacího prvku a měřítkem jeho DPI.
    • Při vysokém DPI bude fyzická velikost větší (více pixelů) ve srovnání s logickou velikostí.
    • Při nízkém DPI bude fyzická velikost menší (méně pixelů) v porovnání s logickou velikostí.
    • Ve výchozím nastavení DPI je fyzická velikost a logická velikost kreslené oblasti stejná.
  • Zdroj výkresu ovládacího prvku (CanvasImageSource pro CanvasControl, CanvasVirtualImageSource pro CanvasVirtualControl a CanvasSwapChain pro CanvasAnimatedControl) je nastaven tak, aby odpovídal velikosti a DPI ovládacího prvku.

Většina operací Win2D se nachází v dipech (jednotky nezávislé na DPI) a prostředky výkresu XAML win2D jsou automaticky dimenzovány tak, aby zohlednily DPI. To znamená, že aplikace můžou často ignorovat DPI. Velikosti a souřadnice jsou vždy nezávislé na DPI, pokud není uvedeno jinak. Aplikace může pevně zakódovat různé velikosti a souřadnice, na kterých se prvky vykreslují do ovládacích prvků, a tento obsah se škáluje při spuštění aplikace v prostředích s různým DPI.

U některých aplikací ale výchozí chování nestačí. Tento článek popisuje několik scénářů, kdy výchozí nastavení nestačí a jaké aplikace ho můžou vyřešit.

Scénář: Obsah ovládacího prvku musí mít nastavené, nižší než běžné rozlišení

Tento scénář může nastat například ve hře 2D sprite, která by se měla vždy vykreslit při pevném rozlišení 640x480 bez ohledu na skutečný hardware zobrazení, na kterém běží.

Řešení tohoto problému nevyžaduje výhradně psaní nového kódu Win2D.

Objekt Viewbox XAML umožňuje omezit velikosti svých podřízených vizuálních prvků a automaticky přidává škálování, s letterboxingem nebo pillarboxem k zachování poměru stran podle potřeby.

Jednoduše se ujistěte, že CanvasControl, CanvasVirtualControl, nebo CanvasAnimatedControl je podřízeným prvkem ViewBox, a poté omezte velikost tohoto ovládacího prvku.

Chcete-li například omezit velikost ovládacího prvku na šířku 320 pixelů a výšku 224 pixelů, bez ohledu na DPI, pak místo:

<canvas:CanvasAnimatedControl/>

Použití:

<Viewbox>
    <canvas:CanvasAnimatedControl  Width="320" Height="224"/>
</Viewbox>

Pokud vaše aplikace nemá zachovat poměr stran pomocí letterboxingu/pillarboxingu, přidejte atribut Stretch.

<Viewbox Stretch="Fill">
    <canvas:CanvasAnimatedControl Width="320" Height="224"/>
</Viewbox>

Všimněte si, že škálování prováděné prvkem Viewbox nezaručuje žádnou kontrolu nad režimem interpolace. Metoda filtrování může vypadat podobně CanvasInterpolationMode.Linearnebo něco podobného. Pokud vaše aplikace potřebuje konkrétní režim interpolace, nepoužívejte ViewBox s ovládacím prvkem pevné velikosti. Místo toho nakreslete do mezilehlého CanvasRenderTargets pevnou velikostí a pomocí požadovaného režimu interpolace zobrazte zvětšený mezilehlý obraz do cíle.

Scénář: Aplikace nemůže dobře fungovat s vysokým rozlišením

Některá zařízení mají velmi vysoký rozlišení displejů, ale jejich grafická procesorová jednotka není dostatečně výkonná k animaci tolik pixelů hladce. Vývojáři nemusí snadno vědět, jak na těchto zařízeních fungují své aplikace, aniž by je otestovali.

Jednou z možností je použít DpiScale vlastnost ovládacího prvku ke snížení DPI ovládacího prvku.

Pokud například chcete ovládací prvek opravit při polovičním rozlišení, použijte:

<canvas:CanvasAnimatedControl DpiScale="0.5" />

Skutečný faktor škálování DPI závisí na potřebách vaší aplikace. Jednou z možností je vypočítat měřítko, které opraví DPI aplikace na 96 a ne více.

Například:

float dpiLimit = 96.0f;

if(control.Dpi > dpiLimit)
{
    control.DpiScale = dpiLimit / control.Dpi;
}

Aby nastavení fungovalo při změně DPI, měla by se aplikace zaregistrovat na DisplayInformation.DpiChanged a použít tuto logiku v obslužné rutině k nastavení měřítka DPI podle nového DPI.

Tím se šetří režijní náklady na výkon aplikace, což využívá skutečnost, že uživatelé nemusí být schopni snadno získat nižší rozlišení na displeji s vysokým rozlišením DPI.

Škálování prováděné, když má řídicí prostředek nižší než nativní rozlišení, nemůže zaručit kontrolu nad režimem interpolace, podobně jako u výše zmíněného ViewBox. Pokud vaše aplikace potřebuje konkrétní režim interpolace, použijte místo toho zprostředkující režim.