Compressione a blocchi
A partire da Windows 8.1, Direct2D supporta diversi formati di pixel compressi a blocchi. Windows 8.1 contiene inoltre un nuovo codec DDS (Windows Imaging Component) per abilitare il caricamento e l'archiviazione di immagini compresse bloccate nel formato di file DDS. La compressione a blocchi è una tecnica per ridurre la quantità di memoria grafica utilizzata dal contenuto bitmap. Usando la compressione a blocchi, l'app può ridurre il consumo di memoria e i tempi di caricamento per le stesse immagini di risoluzione. In alternativa, l'app può usare immagini con risoluzione più o superiore, pur usando lo stesso footprint di memoria GPU.
La compressione a blocchi è stata usata dalle applicazioni Direct3D per molto tempo e con Windows 8.1 è disponibile anche per gli sviluppatori di applicazioni Mainstream e Direct2D.
Questo argomento descrive il funzionamento della compressione a blocchi e come usarla in WIC e Direct2D.
Informazioni sulla compressione a blocchi
block compression (BC) fa riferimento a una classe di tecniche di compressione per ridurre le dimensioni delle trame. Direct3D 11 supporta fino a 7 formati BC diversi a seconda del livello di funzionalità. In Windows 8.1 Direct2D introduce il supporto per i formati BC1, BC2 e BC3 disponibili in tutti i livelli di funzionalità.
Funzionamento della compressione a blocchi
I formati compressi in blocchi usano tutte la stessa tecnica di base per ridurre lo spazio utilizzato dai dati colore. Questa sezione riepiloga l'algoritmo più semplice, BC1. Per una spiegazione più dettagliata, vedere Block Compression.
Prima di tutto, l'immagine è divisa in blocchi di 4 per 4 pixel. Ogni blocco viene compresso separatamente.
Nota
Ciò significa che la larghezza e l'altezza di un'immagine devono essere un multiplo di 4 pixel per essere compressi.
Questa immagine di esempio mostra un blocco di 4x4 pixel all'interno di un'immagine.
Successivamente, all'interno di un blocco da 4 a 4, vengono selezionati due colori "riferimento" e vengono codificati come due valori a 16 bit (5 bit rossi, 6 bit verdi, blu a 5 bit). La scelta di questi colori influisce significativamente sulla qualità dell'immagine ed è nontriviale. Due colori intermedi vengono calcolati interpolando in modo lineare tra i due colori di riferimento nello spazio dei colori RGB. Questo produce un totale di 4 diversi colori possibili; a ogni colore viene assegnato un valore di indice a due bit. Si noti tuttavia che è necessario archiviare solo i due colori dell'endpoint perché l'interpolazione è fissa.
In questa figura i colori 0 e 3 vengono selezionati come colori di riferimento per il blocco, mentre i colori 1 e 2 vengono calcolati usando l'interpolazione lineare.
Infine, ogni pixel del blocco viene mappato a uno dei quattro colori calcolati in precedenza e ogni pixel viene codificato usando il valore dell'indice a due bit.
La quantità totale di dati usata per rappresentare questi 16 pixel è:
16 bits [to define a reference color] * 2 + 2 bits * 16 [number of pixels] = 64 bits
Ciò comporta una densità media di 4 bit per pixel. Per il confronto, il formato comune DXGI_FORMAT_B8G8R8A8_UNORM pixel utilizza 32 bit per pixel.
Questo diagramma mostra che ogni pixel è codificato come indice a 2 bit. L'intero blocco viene codificato in 64 bit.
Esistono varianti per supportare i dati alfa e diversi numeri di canali di colore. BC6H e BC7 usano algoritmi notevolmente diversi per supportare il contenuto HDR (High Dynamic Range) e aumentare rispettivamente la qualità delle immagini.
Formato di file DDS (DirectDraw Surface)
I dati compressi bloccati vengono in genere archiviati in file DDS (DirectDraw Surface). Se sei uno sviluppatore Direct3D, potresti avere familiarità con i file DDS. Si noti che Direct2D supporta solo determinate funzionalità DDS; Per altre informazioni, vedere requisiti DDS .
Vantaggi della compressione dei blocchi
I formati compressi a blocchi differiscono dai formati comuni di compressione delle immagini del settore, ad esempio JPEG, in quanto i formati BC sono supportati in modo nativo dalle GPU moderne. Ciò significa che è possibile caricare direttamente un'immagine compressa in blocco nella GPU senza decodificare o decomprimere. I formati BC utilizzano in media da 4 a 8 bit per pixel; rispetto a una tipica bitmap BGRA a 32 bit non compressi per pixel, ciò comporta un risparmio di memoria di 75% a 87,5%. Inoltre, poiché non è presente alcun passaggio decodificato, il tempo necessario per caricare un'immagine BC viene notevolmente ridotto rispetto ai formati come JPEG.
Quando usare la compressione a blocchi
È consigliabile usare immagini compresse bloccate nella tua app invece di altri formati, ad esempio JPEG, se vuoi ridurre il consumo di memoria delle bitmap o vuoi ridurre i tempi di decodifica e caricamento.
Tuttavia, la compressione a blocchi non è appropriata per tutti i casi e richiede alcuni compromessi. In primo luogo, gli algoritmi di compressione a blocchi sono in perdita. La compressione a blocchi funziona bene con contenuto fotografico naturale, ma può introdurre artefatti visivi indesiderati in immagini con limiti di contrasto elevato e nitidi, ad esempio screenshot generati dal computer. È necessario assicurarsi che gli asset di immagine compressi bloccati abbiano una qualità accettabile dell'immagine prima di usarli.
In secondo luogo, bloccare i file DDS compressi in genere consumano più spazio su disco rispetto alle immagini JPEG simili. Ciò a sua volta aumenterà le dimensioni del pacchetto e i requisiti di larghezza di banda di rete dell'app.
Uso della compressione a blocchi
Questa sezione illustra come generare e usare asset compressi bloccati in un'app Direct2D.
Panoramica
I file DDS compressi bloccati sono un formato ottimizzato per il runtime, ovvero sono ottimizzati specificamente per ottenere prestazioni ottimali in fase di esecuzione dell'app. È consigliabile continuare a usare la pipeline di creazione e modifica degli asset esistente e convertirla in un formato compresso bloccato solo quando vengono importate nel progetto dell'applicazione o in fase di compilazione.
Requisiti DDS
Il formato di file DDS è stato progettato per supportare un'ampia gamma di funzionalità usate in Direct3D. Direct2D usa solo un subset di queste funzionalità. Pertanto, quando si creano immagini DDS da usare con Direct2D, è necessario tenere presenti le restrizioni seguenti:
- Sono consentiti solo i valori DXGI_FORMAT seguenti:
- DXGI_FORMAT_BC1_UNORM
- DXGI_FORMAT_BC2_UNORM
- DXGI_FORMAT_BC3_UNORM
- È necessario usare i dati alfa premoltiplicati. Sono inclusi i file DDS legacy che usano formati che definiscono in modo esplicito caratteri alfa premoltiplicati (DXT1, DXT2, DXT4), nonché file DDS che usano la struttura DDS_HEADER_DX10 con i valori DDS_ALPHA_MODE_OPAQUE e DDS_ALPHA_MODE_PREMULTIPLIED.
- Le dimensioni X e Y devono essere multiple di 4 pixel.
- Non sono consentite trame del volume, mappe cubi, mipmap o matrici di trame. È consigliabile usare solo immagini di origine con frame singolo.
Generazione di asset compressi bloccati
Sono disponibili diversi strumenti di creazione DDS per creare o convertire file DDS compressi in blocchi. Nota non tutti gli strumenti supportano i requisiti per l'uso di file DDS con Direct2D, come descritto nella sezione precedente.
A partire da Visual Studio 2013, è possibile convertire gli asset visivi esistenti come JPEG e PNG nel formato compresso DDS corretto come parte automatica del processo di compilazione. Questa operazione viene eseguita usando il passaggio di compilazione personalizzato dell'attività Contenuto immagine.
Per informazioni su come configurare questa impostazione per il progetto, vedere Procedura: : Esportare una trama per l'uso con App Direct2D o Javascipt.
API Direct2D
Direct2D viene aggiornato in Windows 8.1 per supportare i formati pixel seguenti:
- DXGI_FORMAT_BC1_UNORM
- DXGI_FORMAT_BC2_UNORM
- DXGI_FORMAT_BC3_UNORM
Per i formati precedenti, è necessario usare alfa premoltiplicato. Inoltre, questi formati sono validi solo per l'uso come origine, non come destinazione. Questo significa, ad esempio, che è possibile creare una bitmap Direct2D usando BC1, ma non un contesto di dispositivo.
I metodi seguenti vengono aggiornati in Windows 8.1 per supportare i formati BC:
- ID2D1DeviceContext::IsDxgiFormatSupported
- ID2D1DeviceContext::CreateBitmap
- ID2D1DeviceContext::CreateBitmapFromDxgiSurface
- ID2D1RenderTarget::CreateSharedBitmap
- ID2D1RenderTarget::CreateBitmapFromWicBitmap
- ID2D1Bitmap::CopyFromMemory
- ID2D1Bitmap::CopyFromBitmap
- ID2D1Bitmap1::GetSurface
Si noti che CreateBitmapFromWicBitmap accetta IWICBitmapSource come interfaccia; Tuttavia, in Windows 8.1 WIC non supporta l'acquisizione di dati compressi da IWICBitmapSourcee non esiste alcun formato pixel WIC corrispondente a DXGI_FORMAT_BC1_UNORM e così via. CreateBitmapFromWicBitmap determina invece se l'IWICBitmapSource è un DDS valido IWICBitmapFrameDe code e carica direttamente i dati compressi bloccati. È possibile specificare in modo esplicito il formato pixel nello struct D2D1_BITMAP_PROPERTIES1 oppure consentire a Direct2D di determinare automaticamente il formato corretto.
API del componente Windows Imaging
Windows Imaging Component (WIC) aggiunge un nuovo codec DDS in Windows 8.1. Aggiunge inoltre nuove interfacce che supportano l'accesso a dati specifici di DDS, inclusi i dati pixel compressi bloccati:
Blocca formati pixel WIC compressi
In Windows 8.1 non sono presenti nuovi formati di pixel compressi bloccati wic. Se invece si ottiene un IWICBitmapFrameDecode dal decodificatore DDS e si chiama CopyPixels, si riceveranno pixel non compressi standard, ad esempio WICPixelFormat32bppPGRA. È possibile usare IWICDdsFrameDecode::CopyBlocks per ottenere i dati compressi in blocchi non elaborati sotto forma di buffer di memoria da un file DDS.
Accesso DDS a più frame
Il formato di file DDS consente l'archiviazione di più immagini correlate in un singolo file. Ad esempio, un file DDS può contenere una mappa cubo, una trama del volume o una matrice di trame, che può essere applicata in modo non crittografato. In Direct3D, queste più immagini vengono esposte come sottorisorse. In WIC più immagini vengono esposte come frame (IWICBitmapFrameDecode e IWICBitmapFrameEncode).
WIC supporta solo la nozione di una matrice unidimensionale di fotogrammi, mentre DDS supporta tre dimensioni indipendenti (anche se solo due possono essere usate in un file). WIC offre metodi pratici per facilitare il mapping tra una sottorisorsa DDS e un frame WIC. Per la decodifica, IWICDdsDecoder::GetFrame consente di specificare l'indice della matrice, il livello mip e l'indice della sezione della sottorisorsa e restituisce il frame WIC corretto.
Per la codifica, IWICDdsEncoder::CreateNewFrame calcola l'indice della matrice risultante, il livello mip e l'indice di sezione quando si crea un nuovo frame. È necessario aver chiamato prima IWICDdsEncoder::SetParameters per definire i parametri di file specifici di DDS.
Argomenti correlati
-
Procedura: Esportare una trama da usare con app Direct2D o Javascipt
-
Informazioni di riferimento su per DDS