Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Este artigo explica como configurar a resolução usada pelos controles XAML do Win2D. Explica como:
- Faça com que os controles Win2D sejam executados em uma resolução fixa.
- Ajuste o DPI de controle para melhorar o desempenho renderizando menos pixels.
Resolução e dimensionamento de controlo
"Resolução", como usado neste documento, é outra palavra para o tamanho de um bitmap. Consiste em uma largura e uma altura.
Os objetos que os controlos XAML do Win2D desenham têm uma resolução. Eles também têm um DPI. O DPI de um objeto é uma medida de quão densos 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 terá menos pixels. Para obter mais informações sobre o processamento de DPI pelo Win2D em geral, consulte esta página.
O tamanho independente do DPI às vezes é 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 pelo seu layout, conforme determinado pela sua posição na árvore XAML.
- Um DPI é consultado a partir do ambiente. O DPI do controle está 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 seu DPI.
- Em DPI alto, o tamanho físico será maior (mais pixels) em comparação com o tamanho lógico.
- Em DPI baixo, 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 DPI do controle.
A maioria das operações do Win2D está em dips (unidades independentes de DPI), e os recursos de desenho dos controles XAML do Win2D são dimensionados automaticamente para considerar o DPI. Isso significa que os aplicativos muitas vezes podem ignorar o DPI. Os tamanhos e coordenadas são sempre independentes do DPI, a menos que especificado de outra forma. Um aplicativo pode codificar vários tamanhos e coordenadas nas quais as coisas são desenhadas nos controles, e esse conteúdo é dimensionado quando o aplicativo é executado em ambientes com diferentes DPIs.
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 controlo deve ter uma resolução fixa, inferior ao normal
Este cenário pode surgir, por exemplo, em um jogo de sprite 2D que deve sempre renderizar em uma resolução fixa de 640x480, independentemente do hardware de exibição real em que é executado.
Resolver isso não requer estritamente escrever qualquer novo código Win2D.
O objeto XAML Viewbox permite-lhe restringir os tamanhos dos elementos visuais subordinados, adicionando automaticamente dimensionamento, recorrendo a letterboxing ou pillarboxing para preservar as proporções de aspeto, conforme necessário.
Basta garantir que seu CanvasControl, CanvasVirtualControl ou CanvasAnimatedControl seja um elemento filho de um ViewBoxe restrinja 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/>
Utilização:
<Viewbox>
<canvas:CanvasAnimatedControl Width="320" Height="224"/>
</Viewbox>
Se seu aplicativo não deve preservar a proporção adicionando letterboxing/pillarboxing, adicione o atributo Stretch:
<Viewbox Stretch="Fill">
<canvas:CanvasAnimatedControl Width="320" Height="224"/>
</Viewbox>
Observe que o dimensionamento realizado pelo elemento Viewbox não garante nenhum controle sobre o modo de interpolação. O método de filtragem pode ser CanvasInterpolationMode.Linearou algo semelhante. Se seu aplicativo precisar de um modo de interpolação específico, não use ViewBox com um controle de tamanho fixo. Em vez disso, crie um CanvasRenderTargetintermediário de tamanho fixo e use o modo de interpolação desejado para aplicar o intermediário redimensionado ao destino.
Cenário: o aplicativo não pode ter um bom desempenho em altas resoluções
Alguns dispositivos têm monitores de alta resolução, mas sua unidade de processamento gráfico não é poderosa o suficiente para animar tantos pixels suavemente. Os desenvolvedores podem não estar prontamente cientes de como seus aplicativos funcionam 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 não superior.
Por exemplo:
float dpiLimit = 96.0f;
if(control.Dpi > dpiLimit)
{
control.DpiScale = dpiLimit / control.Dpi;
}
Para garantir que esta configuração funcione em alterações de DPI, a aplicação deve subscrever DisplayInformation.DpiChanged e usar essa lógica no manipulador para definir a escala de DPI em relação ao novo DPI.
Isto poupa à aplicação alguma sobrecarga de desempenho, explorando o facto de os utilizadores poderem não conseguir perceber facilmente a resolução reduzida num ecrã de alto DPI.
O dimensionamento realizado ao usar um recurso de controle com uma resolução inferior à resolução nativa não pode garantir o controle sobre o modo de interpolação, semelhante ao ViewBox mencionado acima. Se o seu aplicativo precisar de um modo de interpolação específico, use um intermediário.
Windows developer