Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este artigo explica como configurar a resolução usada pelos controles XAML do Win2D. Ele explica como:
- Faça com que os controles Win2D são executados em uma resolução fixa.
- Ajuste a DPI de controle para melhorar o desempenho renderizando menos pixels.
Resolução e dimensionamento de controle
"Resolução", conforme usado neste documento, é outra palavra para o tamanho de um bitmap. Ele consiste em uma largura e altura.
Os objetos que os controles XAML do Win2D desenham para ter uma resolução. Eles também têm um DPI. O DPI de um objeto é uma medida de quão densas são os pixels desse objeto, quando desenhados. O DPI se comporta como um fator de escala, um DPI alto aumenta o número de pixels que compõem o objeto desenhado. Por outro lado, baixar o DPI de um objeto significa que ele abrangerá menos pixels. Para obter mais informações sobre a manipulação de DPI do Win2D em geral, consulte esta página.
Às vezes, o tamanho independente de DPI é chamado de "tamanho lógico". E um tamanho dependente de DPI, em pixels, é chamado de "tamanho físico".
Em termos de resolução e dimensionamento, o comportamento padrão de um controle quando ele é carregado é:
- O tamanho lógico do controle é determinado por seu layout, conforme determinado pelo local em que ele cai na árvore XAML.
- Uma DPI é consultada do ambiente. O DPI do controle é definido para isso.
- A quantidade de pixels físicos que compõem a área desenhável do controle é determinada pelo tamanho do controle, dimensionado por sua DPI.
- Em DPI alta, o tamanho físico será maior (mais pixels) em comparação com o tamanho lógico.
- Em DPI baixa, o tamanho físico será menor (menos pixels) em comparação com o tamanho lógico.
- No DPI padrão, o tamanho físico e o tamanho lógico da área desenhável são os mesmos.
- O recurso de desenho do controle (
CanvasImageSourceparaCanvasControl,CanvasVirtualImageSourceparaCanvasVirtualControleCanvasSwapChainparaCanvasAnimatedControl) é definido para corresponder ao tamanho e ao DPI do controle.
A maioria das operações Win2D está em dips (unidades independentes de DPI) e os recursos de desenho dos controles XAML do Win2D são dimensionados automaticamente para levar em conta o DPI. Isso significa que os aplicativos geralmente podem ignorar o DPI. Tamanhos e coordenadas são sempre independentes de DPI, a menos que especificados de outra forma. Um aplicativo pode codificar vários tamanhos e coordenadas em que as coisas são desenhadas nos controles e esse conteúdo é dimensionado quando o aplicativo é executado em ambientes com DPIs diferentes.
Mas, para alguns aplicativos, o comportamento padrão não é suficiente. Este artigo descreve alguns cenários em que o padrão não é suficiente e o que os aplicativos podem fazer para corrigi-lo.
Cenário: o conteúdo do controle deve ter uma resolução fixa, mais baixa que a normal.
Esse cenário pode surgir, por exemplo, em um jogo de sprite 2D que sempre deve ser renderizado em uma resolução 640x480 fixa, independentemente do hardware de exibição real em que ele é executado.
Resolver isso não requer estritamente escrever nenhum novo código Win2D.
O objeto XAML Viewbox permite restringir os tamanhos de seus elementos visuais filhos, aplicando automaticamente o redimensionamento, com barras horizontais ou verticais para preservar a proporção, conforme o necessário.
Basta garantir que seu CanvasControl, CanvasVirtualControl ou CanvasAnimatedControl seja um elemento filho de um ViewBoxe restringir o tamanho desse controle.
Por exemplo, para restringir o tamanho do controle a 320 pixels de largura e 224 pixels de altura, independentemente do DPI, em vez de:
<canvas:CanvasAnimatedControl/>
Use:
<Viewbox>
<canvas:CanvasAnimatedControl Width="320" Height="224"/>
</Viewbox>
Se o aplicativo não deve preservar a taxa de proporção adicionando letterboxing/pillarboxing, adicione o atributo Stretch:
<Viewbox Stretch="Fill">
<canvas:CanvasAnimatedControl Width="320" Height="224"/>
</Viewbox>
Observe que o dimensionamento executado pelo elemento Viewbox não garante nenhum controle sobre o modo de interpolação. O método de filtragem pode se parecer com CanvasInterpolationMode.Linear, ou algo semelhante. Se o aplicativo precisar de um modo de interpolação específico, não use ViewBox com um controle de tamanho fixo. Em vez disso, desenhe para um CanvasRenderTarget de tamanho fixo intermediário e use o modo de interpolação desejado para desenhar o intermediário dimensionado para o destino.
Cenário: o aplicativo não pode ter um bom desempenho em altas resoluções
Alguns dispositivos têm exibições de alta resolução, mas sua unidade de processamento de gráficos não é poderosa o suficiente para animar muitos pixels sem problemas. Os desenvolvedores podem não estar prontamente cientes de como seus aplicativos são executados nesses dispositivos sem testá-los.
Uma opção é usar a propriedade DpiScale do controle para reduzir o DPI do controle.
Por exemplo, para corrigir o controle em meia resolução, use:
<canvas:CanvasAnimatedControl DpiScale="0.5" />
O fator de escala de DPI real depende das necessidades do seu aplicativo. Uma opção é calcular um fator de escala que corrigirá o DPI do aplicativo em 96 e nenhum mais alto.
Por exemplo:
float dpiLimit = 96.0f;
if(control.Dpi > dpiLimit)
{
control.DpiScale = dpiLimit / control.Dpi;
}
Para garantir que essa configuração funcione entre as alterações de DPI, o aplicativo deve assinar DisplayInformation.DpiChanged e usar essa lógica no manipulador para definir a escala de DPI em relação ao novo DPI.
Isso reduz parte da sobrecarga de desempenho do aplicativo, aproveitando o fato de que os usuários talvez não percebam facilmente a resolução reduzida em uma tela de alta DPI.
O dimensionamento realizado ao usar um recurso de controle com resolução inferior à nativa não pode garantir o controle sobre o modo de interpolação, semelhante ao ViewBox mencionado acima. Se seu aplicativo precisar de um modo de interpolação específico, use um intermediário.
Windows developer