Compactação de bloco de bitmap

CanvasBitmap dá suporte a bitmaps compactados em bloco. Eles podem ser carregados de um arquivo DDS ou criados com CreateFromBytes(ICanvasResourceCreator,Byte[], Int32, Int32, DirectXPixelFormat).

Bitmaps com compressão por blocos são ótimos para aplicativos com uso intenso de bitmaps (como jogos), porque ocupam menos memória e podem ser renderizados 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 blocos

A compactação de blocos é 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, são descompactados em um bitmap com um formato como DirectXPixelFormat::B8G8R8A8UIntNormalized, que usa 32 bits (4 bytes) por pixel. Portanto, um bitmap 256x256 levaria até 256 * 256 * 4 = 262.144 bytes.

Um bitmap compactado em bloco usa 8 ou 16 bytes (dependendo do formato -- mais adiante) para armazenar um bloco de 4x4 pixels. Portanto, nesse caso, um bitmap 256x256 levaria até 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 blocos tem suporte diretamente pelo hardware de 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 em bloco. A tabela a seguir descreve esses formatos, juntamente com um formato descompactado para comparação.

DirectXPixelFormat Tamanho do bitmap 4x4 Tamanho do bitmap de 256 x 256 Alpha
BC1Unorm 8 bytes 32.768 bytes 1 bit
BC2Unorm 16 bytes 65.536 bytes 4 bits
BC3Unorm 16 bytes 65.536 bytes ~8 bit (comprimido)
B8G8R8A8UintNormalized 64 bytes 262.144 bytes 8 bits

BC1Unorm BC2Unorm e BC3Unorm diferem principalmente na forma como dão suporte a alfa. BC1 dá suporte apenas a alfa de 1 bit. BC2 dá suporte a cada pixel no bloco com um valor alfa exclusivo de 4 bits. BC3 compacta os valores alfa.

Consulte a documentação da Compactação de Blocos Direct2D e a documentação de Compactação de Blocos Direct3D para obter mais informações sobre como a compactação de blocos funciona.

Restrictions

  • Todas as texturas compactadas em bloco devem ter uma largura e altura que seja um múltiplo de 4. Isso ocorre porque a compactação por blocos funciona em blocos de 4x4 pixels.
  • Qualquer operação em um sub-retângulo de uma textura compactada em bloco (usando GetPixelBytes(), SetPixelBytes(Byte[]), CopyPixelsFromBitmap(CanvasBitmap, Int32, Int32)) exige que o sub-retângulo esteja alinhado a 4 pixels.
  • O Win2D exige alfa premultiplicado ao usar formatos com compactação em bloco.

Criação de arquivos DDS

As imagens compactadas de bloco podem ser salvas em arquivos DDS. Embora eles possam ser gerados por plug-ins para aplicativos como Photoshop ou Paint.NET, é necessário ter cuidado para garantir que o arquivo resultante seja salvo com alfa pré-multiplicado. O Win2D carregará qualquer arquivo DDS que contenha uma imagem BC1Unorm, BC2Unorm ou BC3Unorm e presumirá que ele tenha sido 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 na documentação do Visual Studio.

Como alternativa, você pode usar texconv.exe de https://github.com/Microsoft/DirectXTex. texconv.exe pode ser criado usando a solução DirectXTex_Desktop_2015.sln. O comando a seguir converte "smoke.png" para um BC3Unorm com alfa pré-multiplicado:

texconv -pmalpha -m 1 -f BC3_UNORM smoke.png