Compartilhar via


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 BC1Unormou 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