Scelta della risoluzione dei controlli

Questo articolo illustra come configurare la risoluzione usata dai controlli XAML di Win2D. Spiega come fare per:

  • Fare in modo che i controlli Win2D vengano eseguiti a una risoluzione fissa.
  • Regolare i DPI del controllo per migliorare le prestazioni visualizzando meno pixel.

Risoluzione e dimensionamento dei controlli

"Risoluzione", come usato in questo documento, è un'altra parola per le dimensioni di una bitmap. È costituito da una larghezza e un'altezza.

Gli oggetti su cui disegnano i controlli XAML di Win2D hanno una risoluzione. Hanno anche un DPI. Il valore DPI di un oggetto è una misura della densità dei pixel di tale oggetto, quando viene disegnato. DPI si comporta come un fattore di scala: un valore DPI elevato aumenta il numero di pixel che costituiscono l'oggetto disegnato. D'altra parte, abbassare i DPI di un oggetto significa che occuperà meno pixel. Per altre informazioni sulla gestione generale di DPI di Win2D, vedi questa pagina.

Le dimensioni indipendenti da DPI sono talvolta denominate "dimensioni logiche". E una dimensione dipendente da DPI, in pixel, è denominata "dimensione fisica".

In termini di risoluzione e ridimensionamento, il comportamento predefinito di un controllo quando viene caricato è:

  • Le dimensioni logiche del controllo sono determinate dal relativo layout, come determinato dalla posizione in cui rientra nell'albero XAML.
  • Il valore DPI viene recuperato dall'ambiente. Il valore DPI del controllo è impostato su tale valore.
  • La quantità di pixel fisici che comprendono l'area disegnabile del controllo è determinata dalle dimensioni del controllo, ridimensionate in base alla relativa DPI.
    • Con valori DPI elevati, le dimensioni fisiche saranno maggiori (più pixel) rispetto alle dimensioni logiche.
    • In DPI basso, le dimensioni fisiche saranno inferiori (meno pixel) rispetto alle dimensioni logiche.
    • In DPI predefinito, le dimensioni fisiche e le dimensioni logiche dell'area di disegno sono uguali.
  • La risorsa di disegno del controllo (CanvasImageSource per CanvasControl, CanvasVirtualImageSource pwr CanvasVirtualControl e CanvasSwapChain per CanvasAnimatedControl) è impostata in modo che corrisponda alle dimensioni e alla DPI del controllo.

La maggior parte delle operazioni di Win2D viene eseguita in DIP (unità indipendenti dai DPI) e le risorse di disegno dei controlli XAML di Win2D vengono dimensionate automaticamente per tenere conto dei DPI. Ciò significa che le applicazioni spesso possono ignorare DPI. Le dimensioni e le coordinate sono sempre indipendenti da DPI, se non diversamente specificato. Un'applicazione può definire in modo fisso varie dimensioni e coordinate alle quali gli elementi vengono disegnati nei controlli, e tale contenuto viene ridimensionato quando l'applicazione viene eseguita in ambienti con DPI diversi.

Per alcune applicazioni, tuttavia, il comportamento predefinito non è sufficiente. Questo articolo illustra alcuni scenari in cui il valore predefinito non è sufficiente e quali app possono eseguire per risolverlo.

Scenario: il contenuto del controllo deve essere visualizzato a una risoluzione fissa, inferiore al normale

Questo scenario può verificarsi, ad esempio, in un gioco sprite 2D che deve sempre eseguire il rendering a una risoluzione fissa di 640x480, indipendentemente dall'hardware di visualizzazione effettivo su cui viene eseguito.

Per risolvere questo problema non è strettamente necessario scrivere alcun nuovo codice Win2D.

L'oggetto XAML Viewbox consente di limitare le dimensioni degli elementi visivi figlio, applicando automaticamente il ridimensionamento, con letterboxing o pillarboxing per preservare le proporzioni secondo necessità.

Assicurarsi semplicemente che CanvasControl, CanvasVirtualControl o CanvasAnimatedControl sia un elemento figlio di un ViewBoxe limitare le dimensioni di tale controllo.

Ad esempio, per vincolare le dimensioni del controllo a 320 pixel di larghezza e 224 pixel di altezza, indipendentemente da DPI, invece di:

<canvas:CanvasAnimatedControl/>

Usa:

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

Se la tua app non deve preservare il rapporto d'aspetto mediante l'aggiunta di letterboxing/pillarboxing, aggiungi l'attributo Stretch:

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

Si noti che il ridimensionamento eseguito dall'elemento Viewbox non garantisce alcun controllo sulla modalità di interpolazione. Il metodo di filtro può essere simile a CanvasInterpolationMode.Linearo qualcosa di simile. Se l'app richiede una particolare modalità di interpolazione, non usare ViewBox con un controllo a dimensione fissa. Disegna invece su un elemento intermedio di dimensioni fisse CanvasRenderTarget, quindi usa la modalità di interpolazione desiderata per disegnare l'elemento intermedio ridimensionato nella destinazione finale.

Scenario: l'app non può funzionare bene con risoluzioni elevate

Alcuni dispositivi hanno schermi ad alta risoluzione, ma la loro unità di elaborazione grafica non è abbastanza potente da animare in modo uniforme molti pixel. Gli sviluppatori potrebbero non essere facilmente consapevoli del modo in cui le app eseguono su questi dispositivi senza testarle.

Un'opzione consiste nell'usare la DpiScale proprietà del controllo per ridurre il valore DPI del controllo.

Ad esempio, per correggere il controllo a metà risoluzione, usare:

<canvas:CanvasAnimatedControl DpiScale="0.5" />

Il fattore di scala DPI effettivo dipende dalle esigenze dell'app. Un'opzione consiste nel calcolare un fattore di scala che correggerà il valore DPI dell'app a 96 e non superiore.

Ad esempio:

float dpiLimit = 96.0f;

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

Per garantire che questa impostazione funzioni anche in caso di variazioni del DPI, l'applicazione deve registrarsi a DisplayInformation.DpiChanged e usare questa logica nel gestore dell'evento per impostare il fattore di scala DPI in base al nuovo valore DPI.

Ciò consente all'app di ridurre in parte il sovraccarico prestazionale, sfruttando il fatto che gli utenti potrebbero non riuscire a percepire facilmente la risoluzione ridotta su un display ad alta densità di DPI.

Il ridimensionamento eseguito con una risorsa di controllo di risoluzione inferiore a quella nativa non può garantire il controllo sulla modalità di interpolazione, come ViewBox indicato in precedenza. Se l'app richiede una particolare modalità di interpolazione, usa invece un livello intermedio.