Compactação de bloco de bitmap
CanvasBitmap
Suporta bitmaps compactados em bloco. Eles podem ser carregados de um arquivo DDS ou criados com CreateFromBytes(ICanvasResourceCreator,Byte[], Int32, Int32, DirectXPixelFormat)
.
Os bitmaps compactados em bloco são ótimos para aplicativos pesados de bitmap (como jogos) porque ocupam menos memória e podem ser desenhados com mais eficiência. Um bitmap compactado em bloco usa até 1/8 da memória de um bitmap não compactado. Como resultado, a GPU precisa acessar muito menos memória ao desenhar o bitmap, resultando em um desenho mais rápido.
Sobre a compactação de bloco
A compactação de bloco é diferente da compactação empregada por arquivos PNG ou JPG. Os formatos de arquivo compactados são armazenados compactados, mas quando são carregados pelo Win2D, eles são descompactados em um bitmap com um formato como DirectXPixelFormat::B8G8R8A8UIntNormalized
, que usa 32 bits (4 bytes) por pixel. Portanto, um bitmap de 256 x 256 ocuparia 256 * 256 * 4 = 262.144 bytes.
Um bitmap compactado em bloco usa 8 ou 16 bytes (dependendo do formato - mais sobre isso mais tarde) para armazenar um bloco de 4x4 pixels. Portanto, nesse caso, um bitmap de 256 x 256 ocuparia 256 * 256 / (4 * 4) * 8 = 32.768 bytes, ou 256 * 256 / (4 * 4) * 16 = 65.536 bytes. Isso é até 8 vezes menor! Como a compactação de bloco é suportada diretamente pelo hardware da GPU, o bitmap pode ser mantido compactado na memória e extraído diretamente do formato compactado sem precisar descompactá-lo completamente.
O Win2D dá suporte a três formatos compactados de bloco. A tabela abaixo descreve esses formatos, juntamente com um formato não compactado para comparação.
DirectXPixelFormat |
Tamanho do bitmap 4x4 | Tamanho do bitmap 256x256 | Alfa |
---|---|---|---|
BC1Unorm |
8 bytes | 32.768 bytes | 1 bit |
BC2Unorm |
16 bytes | 65.536 bytes | 4 bits |
BC3Unorm |
16 bytes | 65.536 bytes | ~ 8 bits (compactado) |
B8G8R8A8UintNormalized |
64 bytes | 262.144 bytes | 8 bits |
BC1Unorm
, BC2Unorm
e BC3Unorm
diferem principalmente em como eles suportam alfa. BC1 suporta apenas alfa de 1 bit. BC2 suporta cada pixel no bloco com um valor alfa exclusivo de 4 bits. BC3 compacta os valores alfa.
Consulte a documentação de compactação de bloco do Direct2D e a documentação de compactação de bloco do Direct3D para obter mais informações sobre como funciona a compactação de bloco.
Restrições
- Todas as texturas compactadas de bloco devem ter uma largura e altura que seja um múltiplo de 4. Isso ocorre porque a compactação de blocos funciona em blocos de 4x4 pixels.
- Qualquer operação em um sub-retângulo de uma textura compactada de bloco (usando
GetPixelBytes()
,SetPixelBytes(Byte[])
,CopyPixelsFromBitmap(CanvasBitmap, Int32, Int32)
) requer que o sub-retângulo seja alinhado a 4 pixels. - O Win2D requer alfa pré-multiplicado ao usar formatos compactados em bloco.
Criação de arquivos DDS
As imagens compactadas em bloco podem ser salvas em arquivos DDS. Embora eles possam ser gerados por plug-ins para aplicativos como Photoshop ou Paint.NET, deve-se tomar cuidado para garantir que o arquivo resultante seja salvo com alfa pré-multiplicado. O Win2D carregará qualquer arquivo DDS que contenha um BC1Unorm
ou BC2Unorm
BC3Unorm
uma imagem e assumirá que ele foi criado com alfa pré-multiplicado.
Se você estiver criando um projeto C++, poderá usar o Pipeline de Conteúdo de Imagem para converter a imagem, conforme descrito no MSDN.
Como alternativa, você pode usar texconv.exe
a partir de https://github.com/Microsoft/DirectXTex. texconv.exe
pode ser construído usando a solução DirectXTex_Desktop_2015.sln. O comando a seguir converte "smoke.png" em um BC3Unorm
alfa com alfa pré-multiplicado:
texconv -pmalpha -m 1 -f BC3_UNORM smoke.png
Windows developer