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.
CanvasBitmap suporta bitmaps comprimidos em bloco. Estes podem ser carregados a partir de um ficheiro DDS, ou criados com CreateFromBytes(ICanvasResourceCreator,Byte[], Int32, Int32, DirectXPixelFormat).
Os bitmaps comprimidos em blocos são ótimos para aplicações com muitos bitmaps (como jogos) porque consomem menos memória e podem ser desenhados de forma mais eficiente. Um bitmap comprimido por blocos usa até 1/8 da memória de um bitmap não comprimido. Como resultado, a GPU precisa de aceder a muito menos memória ao desenhar o bitmap, o que resulta num desenho mais rápido.
Sobre compressão de blocos
A compressão em blocos é diferente da compressão utilizada por ficheiros PNG ou JPG. Os formatos de ficheiro comprimidos são armazenados comprimidos, mas quando são carregados pelo Win2D são descomprimidos num bitmap com um formato como DirectXPixelFormat::B8G8R8A8UIntNormalized, que usa 32 bits (4 bytes) por pixel. Assim, um bitmap de 256x256 ocuparia 256 * 256 * 4 = 262.144 bytes.
Um bitmap comprimido em blocos usa 8 ou 16 bytes (dependendo do formato — falarei mais sobre isto depois) para armazenar um bloco de 4x4 píxeis. Assim, neste caso, um bitmap de 256x256 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 compressão por blocos é suportada diretamente pelo hardware da GPU, o bitmap pode ser mantido comprimido na memória e desenhado diretamente do formato comprimido sem nunca ter de o descomprimir completamente.
O Win2D suporta formatos comprimidos em três blocos. A tabela abaixo descreve estes formatos, juntamente com um formato não comprimido para comparação.
DirectXPixelFormat |
Tamanho do bitmap 4x4 | Tamanho do bitmap 256x256 | Alpha |
|---|---|---|---|
BC1Unorm |
8 bytes | 32.768 bytes | 1 bit |
BC2Unorm |
16 bytes | 65.536 bytes | 4 bit |
BC3Unorm |
16 bytes | 65.536 bytes | ~8 bits (comprimido) |
B8G8R8A8UintNormalized |
64 bytes | 262.144 bytes | 8 bit |
BC1Unorm, BC2Unorm e BC3Unorm diferem principalmente na forma como suportam o alfa. O BC1 suporta apenas alfa de 1 bit. O BC2 suporta que cada pixel do bloco tenha um valor alfa único de 4 bits. O BC3 comprime os valores alfa.
Consulte a documentação de Compressão de Blocos Direct2D e a documentação de Compressão de Blocos Direct3D para mais informações sobre como funciona a compressão de blocos.
Restrictions
- Todas as texturas comprimidas em blocos devem ter uma largura e altura que sejam múltiplos de 4. Isto porque a compressão de blocos funciona em blocos de 4x4 píxeis.
- Qualquer operação num sub-retângulo de uma textura comprimida em blocos (usando
GetPixelBytes(),SetPixelBytes(Byte[]),CopyPixelsFromBitmap(CanvasBitmap, Int32, Int32)) exige que o sub-retângulo esteja alinhado a 4 píxeis. - O Win2D requer alfa pré-multiplicado ao utilizar formatos com compressão por blocos.
Criação de ficheiros DDS
Imagens comprimidas em bloco podem ser guardadas em ficheiros DDS. Embora estes possam ser gerados por plugins de aplicações como Photoshop ou Paint.NET, é necessário ter cuidado para garantir que o ficheiro resultante é guardado com alfa pré-multiplicado. O Win2D carrega qualquer ficheiro DDS que contenha uma imagem BC1Unorm, BC2Unorm ou BC3Unorm e assume que foi criada com alfa pré-multiplicado.
Se estiver a criar um projeto em C++, pode usar o Canal de Conteúdo de Imagem para converter a imagem, conforme descrito na documentação do Visual Studio.
Alternativamente, 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 seguinte converte "smoke.png" numa BC3Unorm com alfa pré-multiplicado:
texconv -pmalpha -m 1 -f BC3_UNORM smoke.png
Windows developer